工作原理
位置记数法在任何进制下都是同一套算法:数值等于各位数字乘以该进制的位置次幂之和。从十进制转到其他进制靠反复取商和余数提取各位;转入十进制则靠反复乘加累加。之所以必须用 BigInt 而不是普通数字,是因为 JavaScript 的数字是 IEEE-754 双精度浮点,只能精确表示 53 位整数,因此 64 位数值——例如雪花 ID 或较大的哈希——在解析的那一刻就会静默丢失低位:9007199254740993 会变成 9007199254740992,而这个损坏在数值比对失败之前完全不可见。
负数没有唯一的十六进制表示,字长决定一切。在 32 位补码方案里负一是 FFFFFFFF,同样的值在 64 位下是 FFFFFFFFFFFFFFFF,在 8 位下是 FF。三种都正确,而脱离字长它们都没有意义。这不是理论问题:规定有符号 32 位字段的协议、按 16 位字计算的校验和、以及存储 64 位小端整数的文件格式,各自期待不同的呈现。位宽视图把这一选择显式化,并排显示有符号与无符号读法。
位级解读是把换算工具变成调试工具的关键。位长度告诉你一个值有多少有效位,从而揭示某个标志位是否被置起、某个值是否溢出了预期字段。置位数——值为 1 的比特个数——用于哈希质量检查与纠错码。把同样的 32 位当作 IEEE-754 浮点来读,正是发现寄存器里的 1065353216 其实是 1.0 的方法,这个技巧在逆向二进制格式或排查序列化不一致时反复出现。
基于字母表的编码是另一个家族,之所以一并提供,是因为它们常与数值进制混淆。Base32、Base58、Base62、Base64 编码的是字节串而不是数字,用固定字符集让二进制数据可以安全传输。Base58 尤其去掉了印刷时容易混淆的字符——数字 0、大写 O、大写 I、小写 l——这正是比特币地址使用它的原因,也是从截图里抄下来的 base-58 字符串不容易抄错的原因。它与进制转换唯一的共同点,只是“位置化字母表”这个想法。
常见应用场景
- 在十六进制颜色、内存地址或位掩码与十进制之间互相转换。
- 读取日志中的 64 位标识符而不因浮点转换丢失精度。
- 推算负数在指定字长下的有符号十六进制形式。
- 把寄存器值解读为 IEEE-754 浮点,以核对序列化格式。
- 把权限位掩码转成二进制,看清具体哪些位被置起。
- 为使用紧凑字母表的系统把字节串编码成 Base58 或 Base62。
最后更新: 2026-10-14