进制转换

2/8/10/16 及任意 2-36 进制互转,支持大数,二进制分组显示。

—

进制转换:十六进制、位与字节的对应关系

进制的本质是位值记数法

同样的数值,在不同进制下写成不同形状。255 在二进制里是 11111111,八进制里是 377,十六进制里是 FF。它们表示的是同一个数,只是"每位的权重"不同(分别是 2 的幂、8 的幂、16 的幂)。

所以进制转换不改变数值,只改变写法。这和"255 与 0xFF"是同一个数的关系一样。

为什么程序员用十六进制

关键在于一个十六进制位恰好对应 4 个二进制位(因为 16 = 2⁴),而一个字节是 8 位,于是一个字节就是两个十六进制位。这个整齐的对应让读写变得极为方便:

二进制十六进制十进制说明
1010A104 位 = 1 个十六进制位
11111111FF2551 个字节 = 2 个十六进制位
1010 1010AA170分组后可肉眼核对每一位

如果用十进制表示同样的字节,就无法一眼看出位模式。这也是内存地址、颜色值(#FF5733)、哈希值、字符编码、网络包分析、权限掩码全部用十六进制的原因。

本工具在输出二进制时会每 4 位加空格分组,正是为了配合这个对应关系——分组后一组就是一位十六进制,人工核对非常方便。

进制与位宽的实用对照

位宽取值范围(无符号)取值范围(有符号,补码)
8 位0 – 255(0xFF)−128 – 127
16 位0 – 65535(0xFFFF)−32768 – 32767
32 位0 – 4294967295(0xFFFFFFFF)−2147483648 – 2147483647
64 位最大约 1.8 × 1019约 ±9.2 × 1018

看到 0xFF 应该立刻联想到 255(一个字节全满),看到 0xFFFFFFFF 联想到 32 位全满——这是读代码和看日志时的基本直觉。

这里有一个重要的概念:同一串二进制位,按有符号和无符号解释得到不同的数。例如 0xFF:无符号是 255,有符号补码是 −1。所以"看到 FF 就说它等于 255"在涉及有符号类型时是错的。负数用补码表示意味着最高位为 1 时按负数解释,这是溢出的常见来源。

为什么需要 BigInt

JavaScript 的数字是 IEEE 754 双精度浮点,能精确表示的整数上限是 253 − 1 = 9007199254740991。超过这个范围,整数运算会丢精度——这对进制转换是致命的,因为大数、加密相关的数值(哈希、密钥、区块链地址)经常远超这个范围。

本工具使用 BigInt 实现,不受 253 限制,只要内存允许就能处理任意长度的整数。所以可以安全地转换 64 位、128 位甚至更长的整数,不会出现末几位变成 0 或变成奇怪数字的情况。

常见错误

工具怎么用

  1. 在数值框输入数字(如 1010 或 FF)。
  2. 选原进制与目标进制,支持 2 到 36 之间的任意进制。
  3. 点转换。二进制结果会按每 4 位分组,便于与十六进制对照。

适合做位掩码验证(把十六进制掩码转成二进制,一条条数哪几位是 1)、颜色值转换、权限值解读、以及校验收到的十六进制数据。全部在浏览器本地完成。

常见问题

支持多大范围的数?

使用 BigInt 实现,只要内存允许就能处理任意长度整数,不受 2^53 限制。

二进制为什么分组显示?

二进制位数很长,按每 4 位(半字节)加空格分组,便于阅读和人工核对。