进制是怎么回事
任何进制都是按位权展开:在 b 进制里,从右往左第 n 位的权重是 b 的 n 次方。十六进制的 FF 等于 15 乘 16 加 15,也就是 255;二进制的 11111111 同样是 255。之所以计算机领域偏爱二、八、十六进制,是因为它们之间的换算不需要做乘除:一位八进制正好对应三位二进制,一位十六进制正好对应四位二进制,人可以直接分组读写。一个字节是 8 位二进制,写成十六进制只要两个字符,范围是 00 到 FF,这就是内存地址、颜色值、哈希摘要都用十六进制表示的原因。
本工具的实现与使用要点
工具支持 2 到 36 之间的任意进制,数字符号按 0-9、a-z 顺序取用,因此 36 进制的一位最大是 z,代表 35。输入时不区分大小写,允许带负号,也允许写成 0x1F、0b1010、0o777 这类带前缀的形式,还会自动忽略空格、下划线和逗号分隔符,方便从代码里直接粘贴。36 进制常被用来把自增编号压缩成短字符串,例如短链接的后缀;62 进制会再加上大写字母,但那已超出标准写法的范围,本工具不提供。
大整数是这类工具最容易出错的地方。JavaScript 的普通数字是双精度浮点数,只能精确表示 9007199254740991 以内的整数,再大就会丢失末几位。本工具在浏览器支持时使用 BigInt 做任意精度运算,所以 64 位的雪花编号、长哈希串都能正确转换;在不支持的老浏览器上会退回普通数字并给出提示。需要注意这里只处理整数,小数的进制转换不在支持范围内,例如十进制的零点一在二进制中是无限循环的;负数按“负号加绝对值”表示,不是补码,查看补码需要先确定位宽。