使用方法
- 把二进制数粘进上面的文本域,一行一个。位串内部可以用空格或下划线分组,例如
1111 1011与1111_1011都会被当成同一个 8 位数。 - 选位宽。它决定哪一位是符号位:8 位时最高位是 2⁷,16 位时是 2¹⁵。同一串
11111011在 8 位下是 −5,在 16 位下是 +251。 - 选是否按补码解读。需要处理机器数、寄存器值、文件头字段就选「是」;只想按无符号权重求和就选「否」。
- 看结果区的推导步骤:第一行会展开成
1×2⁷ + 1×2⁶ + …,补码行还会给出「反推验证」。完整明细在下面的表格里逐行列出。 - 文本域里按 Ctrl + Enter 立即重算。点「复制结果」把统计与步骤一起带走,点「导出 CSV」把明细表存成文件。
这个二进制转十进制转换器能解决什么问题
一是读寄存器与协议字段。串口日志、CAN 报文、Modbus 寄存器往往以二进制位串打印,字段含义要靠位权判断:第 3 位是「使能」、第 7 位是「故障」。按位加权求和能直接把整串换算成十进制,再用补码解读判断最高位是不是负号。
二是核对考试题与作业。进制转换的作业错在步骤而不是答案时,光看结果没用。本工具把中间量全部列出来——每一项的权重、每一项的乘积、补码的反推过程——可以直接对照自己的草稿找到哪一步算错。
三是批量清洗数据。设备导出的位串常常几十上百行,逐行手算既慢又容易错。粘进来一次算完,再用 CSV 导出接到下一步处理里。
四是搞清「同一串为什么有两个值」。很多人第一次遇到补码时会困惑:为什么 11111011 既等于 251 又等于 −5。原因是它取决于你把这一串当成无符号数还是 8 位有符号数,本工具把两种读法并排显示,一眼就能分清。
本页不做这些事:不做十进制转二进制(那是反向操作,请用底部的「十进制转二进制转换器」),不做浮点数的 IEEE 754 位模式拆解,也不做十六进制、八进制与原码反码的互转。需要一次换算多种进制请用「数字进制转换器」。
换算原理:按位加权、补码与小数位
整数部分是按位加权求和:从左到右第 i 位(0 起算)的权重是 2n−1−i,n 是位串长度;把每一位的值乘上它的权重再相加即可。例如 1010 = 1×2³ + 0×2² + 1×2¹ + 0×2⁰ = 8 + 0 + 2 + 0 = 10。这就是最朴素的定义式,没有任何需要记忆的表格。
补码的关键是「最高位带负权」。把加权求和换成另一套权重就能一次算出有符号值:最高位的权重从 +2n−1 改成 −2n−1,其余位不变。对 8 位的 11111011 就是 −1×2⁷ + 1×2⁶ + 1×2⁵ + 1×2⁴ + 1×2³ + 0×2² + 1×2¹ + 1×2⁰ = −128+64+32+16+8+0+2+1 = −5。另一种等价算法是先用无符号读法得到 251,再减去 2ⁿ(8 位时减 256):251 − 256 = −5。两种算法结果必然一致,因为 −2n−1 = +2n−1 − 2n。
−5 转成 11111011 的三步(这是补码定义的逆过程,也是本工具在步骤区给出的「反推验证」):先写 +5 的 8 位原码 00000101;再逐位取反得到 11111010;最后末位加 1 得到 11111011。末位加 1 时若全是 1 会一路进位,例如 −1 的补码是 11111111,−128 是 10000000,这两个都是要靠进位才能得到的特殊值。
小数部分不是加权求和,而是乘 2 取整。把小数反复乘 2,每次取走整数部分作为下一位、留下小数部分继续乘,直到余下为 0 或达到精度上限。反过来从二进制小数求十进制值时,权重是负次幂:0.1011 = 1×2⁻¹ + 0×2⁻² + 1×2⁻³ + 1×2⁻⁴ = 0.5 + 0 + 0.125 + 0.0625 = 0.6875。注意 0.1(十进制)转成二进制是 0.00011001100110011001… 无限循环,永远除不尽——十进制里有限的小数,在二进制里未必有限,这正是浮点误差的根源。
整数部分为什么必须用 BigInt。这个二进制转十进制转换器把整数读取交给 BigInt('0b' + 位串),而不是 parseInt(x, 2)。原因是 JavaScript 的 Number 采用 IEEE 754 双精度,尾数只有 53 位,超过 253 = 9007199254740992 就不再保证精确:54 位的位串在末位补上 1 之后真值是 9007199254740993,而 parseInt(x, 2) 会把它读成 9007199254740992,差 1。走 BigInt 之后上限 64 位也不丢精度;只有小数部分才回到 Number,并按你设定的小数保留位数截断显示。
完整示例(数值仅作演示)
示例条件与页面打开时的默认值一致:位宽 8 位、按补码解读、小数保留 4 位,文本域里预置了 14 行。
- 第一行
11111011:按位加权 128 + 64 + 32 + 16 + 8 + 0 + 2 + 1 = 无符号 251;最高位为 1,8 位补码下 251 − 256 = −5;十六进制0xFB。 1010:8 + 0 + 2 + 0 = 10,最高位 0 表示非负,补码值同样是 10。10000000:无符号 128,补码下 128 − 256 = −128,是 8 位能表示的最小负数。11111111:无符号 255,补码下 −1。0.1011:含小数点,按负次幂加权求和 = 0.6875,保留 4 位仍是 0.6875;含小数点的行不套用补码,因为小数位没有统一的符号位定义。
把位宽从 8 改成 16,同一批输入会得到不同结论:11111011 只剩 8 位,前面补 8 个 0 后最高位是 0,此时它是 +251 而不是 −5。这就是「同一串两个值」的来源——补码永远依附于位宽,脱开位宽谈补码是没有意义的。
输入范围与 8 位对照表
文本域每行只接受 0、1、一个小数点,以及用于分组显示的空格与下划线。整数位数受「单行整数位上限」约束(默认 8,最大 64),小数位最多 32 位,一次最多 200 行。下表是 8 位补码的常见取值,可与工具算出的结果逐行核对。工具结果表里「十进制值」一列,对纯整数给的是无符号读法,对含小数点的行给的是负次幂加权求和的结果,两者不会混在一起。
| 二进制(8 位) | 无符号值 | 补码值 | 十六进制 |
|---|---|---|---|
| 00000000 | 0 | 0 | 0x00 |
| 00000001 | 1 | 1 | 0x01 |
| 00000101 | 5 | 5 | 0x05 |
| 00001010 | 10 | 10 | 0x0A |
| 01111111 | 127 | 127 | 0x7F |
| 10000000 | 128 | −128 | 0x80 |
| 11111011 | 251 | −5 | 0xFB |
| 11111111 | 255 | −1 | 0xFF |
| 11111110 | 254 | −2 | 0xFE |
| 11111100 | 252 | −4 | 0xFC |
| 10101100 | 172 | −84 | 0xAC |
| 11000000 | 192 | −64 | 0xC0 |
| 11001000 | 200 | −56 | 0xC8 |
| 10010000 | 144 | −112 | 0x90 |
| 00001111 | 15 | 15 | 0x0F |
| 00110011 | 51 | 51 | 0x33 |
| 01010101 | 85 | 85 | 0x55 |
| 10101010 | 170 | −86 | 0xAA |
| 11110000 | 240 | −16 | 0xF0 |
| 10001000 | 136 | −120 | 0x88 |
位宽与可表示范围的关系:8 位无符号 0~255、有符号 −128~127;16 位无符号 0~65535、有符号 −32768~32767;32 位无符号 0~4294967295、有符号 −2147483648~2147483647;64 位无符号 0~18446744073709551615、有符号 −9223372036854775808~9223372036854775807。规律是 n 位无符号上限 2n−1、有符号区间 [−2n−1, 2n−1−1]。
位数上限、精度边界与常见误用
- 整数位上限默认 8,可调到 64。这个二进制转十进制转换器在输入超过上限时直接报错而不是截断——截断会让
11111011变成1111101,值是 125,与 251 差得很远,这种「悄悄给出错误答案」比报错更危险。 - 53 位是 Number 的精度断层,64 位是 BigInt 的实现上限。整数部分走 BigInt,所以 64 位以内都精确;但如果你把本页的结果拿去参与普通浮点运算,一旦十进制值超过 9007199254740992 又会丢精度。
- 小数保留位数只影响显示,不影响内部计算。小数部分的中间值始终按双精度算,最后才按你选的位数截断。设为 0 时
0.1011会显示成 1,看起来像被舍入了,其实是保留了 0 位小数。 - 含小数点的行不套用补码。补码是为「定宽整数」设计的,小数位没有统一的符号位定义。如果输入
1.1又选了补码解读,工具仍按无符号加权求和给出 1.5,不会擅自把它当成负数。 - 前导 0 会被计入位数检查。
000000101是 9 位,在默认 8 位上限下会被拒绝。要去掉前导 0 再粘贴,或者在位串左侧不再补零。 - 十进制小数大多无法精确表示。0.1 的二进制是无限循环,20 位截断的误差是
5.722×10⁻⁷;0.3 截断 20 位的误差是7.629×10⁻⁷。只有像 0.6875 = 0.1011 这样「分母是 2 的幂」的十进制小数,才能被二进制有限位精确表示。 - 十进制转二进制是反向操作,不是本页的功能。本页只做位串到数值的读取方向,反向请用「十进制转二进制转换器」,两边的示例互为验算。
- 补码不是「反码加一」的巧合,而是让减法能用加法实现的设计。把
11111011当作 −5 之后,00000101(+5)与它相加正好得到00000000(模 256 溢出),这正是硬件只做加法就能算减法的原因。
常见问题
同一串 11111011,为什么既说 251 又说 −5?
因为它有两种读法。按无符号读,8 位全部参与加权,得到 251;按 8 位有符号补码读,最高位的权重从 +128 变成 −128,得到 −5。选哪种取决于数据的来源:寄存器原始位、掩码这类通常按无符号读,而温度、增量、差值这类字段按补码读。位宽一变,符号位位置也变,16 位下的 11111011 就是 +251。
为什么 −5 的补码是 11111011,而不是 10000101?
10000101 是「符号位 + 绝对值」的原码写法,它的致命问题是 0 有两个表示(00000000 和 10000000),而且加减法要单独判断符号。补码的 11111011 是通过「取反加一」得到的,只有一个 0,还能让减法直接用加法完成,所以现代硬件一律用补码。
为什么整数要用 BigInt,普通数字不行吗?
普通 Number 是双精度浮点,尾数只有 53 位,超过 253 = 9007199254740992 后相邻可表示整数之间会出现空隙。54 位的位串在末位有差异时可能被读成同一个数。本工具整数部分用 BigInt('0b' + 位串),64 位以内逐位精确。
0.1 为什么在二进制里表示不精确?
因为 0.1 的分母是 10,含有质因数 5,而二进制只能表示分母为 2 的幂的分数。0.1 转二进制是 0.00011001100110011001… 无限循环,取 20 位会截断出 5.722×10⁻⁷ 的误差。0.6875 则因为等于 11/16,能被 0.1011 精确表示。
输入里可以有空格、下划线或前缀 0b 吗?
空格和下划线会被自动去掉,1111 1011 与 1111_1011 都能通过。但 0b 前缀不行——它是编程语言的字面量写法,写进二进制转换器里会被当成非法字符(字母 b 不在 0/1 里),请把前缀去掉。
超长位串会静默截断吗?
不会。整数位超过「单行整数位上限」会明确报错并指出是第几行、有多少位、上限是多少,该行不参与计算,其余行照常输出。这是刻意的:截断一个位串会得到一个看上去合理但完全错误的数值,比直接报错危险得多。
补码值和「反码」是一回事吗?
不是。反码是逐位取反、不末位加一,它同样有 +0 与 −0 两个零,现代系统基本不用。本工具只给无符号值和补码值两列,需要反码请手动做「逐位取反」这一步,正好是补码三步法的中间产物。
小数保留位数改成 0 会怎样?
结果只显示整数部分,小数被舍去而不是四舍五入。例如 0.1011 会显示成 0,而它真实值是 0.6875。这一步只影响显示,内部计算仍按双精度进行;需要看完整精度就把位数调回 4 或更大。
相关工具
- 二进制转十六进制转换器:同样按位读取位串,适合看文件头与颜色值。
- 十六进制转十进制转换器:先把十六进制转成十进制,再和本页结果互相验算。
- 八进制转十进制转换器:权限位、老式编码里常见八进制,口径与本页的按位加权一致。
- 十进制转八进制转换器:反向换算,配合本页可做双向核对。
- 二进制计算器:直接在二进制上做加减乘除,省去先转十进制再算的中间步骤。
- 数字进制转换器:一次把同一个数在二、八、十、十六进制间全部列出来。
- 十进制转十六进制转换器:验证本页给出的
0xFB这类十六进制结果是否正确。 - 编码解码:查看全部编码解码工具。