进制计算器
两个操作数各自指定进制,算完四种进制一起给。用 BigInt 算整数,不受 JavaScript 双精度 53 位的限制;位运算按你选的位宽在补码上做,溢出、截断的效果和 C 里一样。只做进制转换用 进制转换 更顺手。
原码 / 反码 / 补码
输一个十进制整数,看它在定长机器字里三种编码分别长什么样。计算机实际存的是补码——这样加减法能用同一套电路,而且 0 只有一种表示。
格雷码与 BCD 码
格雷码相邻两个数只差一位,编码器、状态机跨时钟域用它可以避免多位同时翻转读出中间值。BCD 用四位二进制表示一位十进制数,老式数码管、实时钟芯片和一些金融格式里还在用。
几件容易搞混的事
- 右移分算术和逻辑两种
- 算术右移(这里用的)保留符号位,负数右移还是负数,对应 C 里有符号数的
>>;逻辑右移高位补 0,对应无符号数,JavaScript 里写作>>>。把负数当无符号右移是经典 bug。 - 位宽不是摆设
- 位运算和补码都在你选的位宽上做。
0xFF & 0x100在 8 位下是 0,在 32 位下还是 0——但~0在 8 位下是0xFF(-1),在 32 位下是0xFFFFFFFF(也是 -1),打印成十六进制就完全不同。 - JavaScript 的位运算只有 32 位
- 原生
& | ^ << >>会先把操作数转成 32 位有符号整数,超过 2³¹−1 就出错。这页用 BigInt 自己实现,所以 64 位是真的 64 位。 - 取余对负数的符号
- C、Java、JavaScript 的
%结果跟被除数同号(-7 % 3 = -1),Python 的%跟除数同号(-7 % 3 = 2)。这里按前一种。 - 相关工具
- 进制转换、大数计算、科学计算器、字符转 16 进制、校验码计算。