二进制转十进制转换器

把 0 和 1 组成的位串按位权加起来,给出无符号值与 8/16/32/64 位补码值,并把加权求和、负号反推、小数位乘 2 取整的每一步都摊开给你看。

原串位数十进制值补码值十六进制

提示:文本域里按 Ctrl + Enter(macOS 用 Cmd + Enter)立即换算,Enter 留给换行;页面打开时已预置 14 行示例,点「载入示例」可随时还原。

使用方法

  1. 把二进制数粘进上面的文本域,一行一个。位串内部可以用空格或下划线分组,例如 1111 1011 与 1111_1011 都会被当成同一个 8 位数。
  2. 选位宽。它决定哪一位是符号位:8 位时最高位是 2⁷,16 位时是 2¹⁵。同一串 11111011 在 8 位下是 −5,在 16 位下是 +251。
  3. 选是否按补码解读。需要处理机器数、寄存器值、文件头字段就选「是」;只想按无符号权重求和就选「否」。
  4. 看结果区的推导步骤:第一行会展开成 1×2⁷ + 1×2⁶ + …,补码行还会给出「反推验证」。完整明细在下面的表格里逐行列出。
  5. 文本域里按 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 行。

把位宽从 8 改成 16,同一批输入会得到不同结论:11111011 只剩 8 位,前面补 8 个 0 后最高位是 0,此时它是 +251 而不是 −5。这就是「同一串两个值」的来源——补码永远依附于位宽,脱开位宽谈补码是没有意义的。

输入范围与 8 位对照表

文本域每行只接受 0、1、一个小数点,以及用于分组显示的空格与下划线。整数位数受「单行整数位上限」约束(默认 8,最大 64),小数位最多 32 位,一次最多 200 行。下表是 8 位补码的常见取值,可与工具算出的结果逐行核对。工具结果表里「十进制值」一列,对纯整数给的是无符号读法,对含小数点的行给的是负次幂加权求和的结果,两者不会混在一起。

二进制(8 位)无符号值补码值十六进制
00000000000x00
00000001110x01
00000101550x05
0000101010100x0A
011111111271270x7F
10000000128−1280x80

位宽与可表示范围的关系: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]。

位数上限、精度边界与常见误用

常见问题

同一串 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 或更大。

相关工具