什么是进制?如何按位权读数
进制由“基数”决定:每一位能取多少种数字,以及相邻两位之间相差多少倍。十进制的“253”是 2×102 + 5×101 + 3×100。 二进制的“1101”读法完全相同:1×23 + 1×22 + 0×21 + 1×20 = 8 + 4 + 0 + 1 = 13。 无论哪种进制,把“每位数字 × 基数的位序次方”全部相加,就是对应的十进制值。下面计算过程里的“按位权展开”就是这一步。
反过来,十进制转N进制要不断除以N,再把余数从后往前读。13除以2得商6余1,6除以2得商3余0,3除以2得商1余1,1除以2得商0余1, 余数倒着排就是1101。之所以倒着读,是因为最先得到的余数是最低位(个位)。
0~16 对照表
| 十进制 | 二进制 | 八进制 | 十六进制 |
|---|---|---|---|
| 0 | 00000 | 0 | 0 |
| 1 | 00001 | 1 | 1 |
| 2 | 00010 | 2 | 2 |
| 3 | 00011 | 3 | 3 |
| 4 | 00100 | 4 | 4 |
| 5 | 00101 | 5 | 5 |
| 6 | 00110 | 6 | 6 |
| 7 | 00111 | 7 | 7 |
| 8 | 01000 | 10 | 8 |
| 9 | 01001 | 11 | 9 |
| 10 | 01010 | 12 | A |
| 11 | 01011 | 13 | B |
| 12 | 01100 | 14 | C |
| 13 | 01101 | 15 | D |
| 14 | 01110 | 16 | E |
| 15 | 01111 | 17 | F |
| 16 | 10000 | 20 | 10 |
十六进制的一位正好对应二进制的4位,八进制的一位对应3位。所以二进制转十六进制不需要计算:每4位分成一组,在表里查即可。 例如 1011 0101 分成 B 和 5,结果是 B5。反过来,把十六进制的每一位展开成4位二进制就行。
为什么计算机使用二进制
电子电路最容易稳定处理的是两种界限分明的状态,比如电压的高与低,因此以0和1的二进制为基础。但二进制位数太长,不便阅读, 所以内存地址、错误码、颜色值用能把4位合成一个字符的十六进制来写,Unix文件权限则用能把3位合成一个字符的八进制。 1,000用二进制是1111101000(10位),八进制是1750,十六进制是3E8,越来越短。
2的幂对照表
下表在构建页面时用BigInt计算,即使超过253也是准确的。
| 指数 | 十进制 | 十六进制 |
|---|---|---|
| 2^0 | 1 | 1 |
| 2^1 | 2 | 2 |
| 2^2 | 4 | 4 |
| 2^3 | 8 | 8 |
| 2^4 | 16 | 10 |
| 2^5 | 32 | 20 |
| 2^6 | 64 | 40 |
| 2^7 | 128 | 80 |
| 2^8 | 256 | 100 |
| 2^10 | 1,024 | 400 |
| 2^12 | 4,096 | 1000 |
| 2^16 | 65,536 | 10000 |
| 2^20 | 1,048,576 | 100000 |
| 2^24 | 16,777,216 | 1000000 |
| 2^31 | 2,147,483,648 | 80000000 |
| 2^32 | 4,294,967,296 | 100000000 |
| 2^53 | 9,007,199,254,740,992 | 20000000000000 |
| 2^63 | 9,223,372,036,854,775,808 | 8000000000000000 |
| 2^64 | 18,446,744,073,709,551,616 | 10000000000000000 |
28 = 256 是一个字节能表示的值的个数(0~255),216 = 65,536 是端口号的个数(0~65535)。JavaScript的普通数值是64位浮点数, 只有在 253 − 1 = 9,007,199,254,740,991 以内才能准确表示每一个整数,超过后有些整数无法表示,所以本转换器用BigInt来计算。
精度、负数和小数的处理方式
- 大整数:输入的各位数字用BigInt累加计算,工具本身没有位数限制,结果准确。输入几千位以上时,浏览器可能变慢。
- 负数:每一栏都可以在开头输入 -。按有符号数转换,所以 -255 的二进制是 -11111111,十六进制是 -FF。
- 不支持小数:小数点不在允许的字符之内,0.1 这样的输入会提示“不能使用的字符”。0.1 在二进制中是无限循环小数,是浮点误差的根源,但本工具只处理整数。
- 前缀:在对应的栏里,0b、0o、0x(分别对应二进制、八进制、十六进制)会被自动去掉,空格和下划线也会被忽略,所以可以输入 1111_0000。
- 计算过程的显示:按位权展开只在输入不超过16位时显示;除法表在数非常大时最多显示40步。
负数与补码
计算机通常用补码存储负整数。在n位中,-x 表示为 2n − x。8位时,-1 是 256 − 1 = 255 = 11111111(十六进制 FF), -128 是 10000000(80),+127 是 01111111(7F)。同一个位模式 FF,按无符号数读是255,按有符号数读是 -1, 所以位模式必须先确定位宽和是否有符号才有意义。上方输入负数时会列出8、16、32、64位的表示,装不下的位宽不会显示。
| 位宽 | 有符号最小值 | 有符号最大值 | 无符号最大值 |
|---|---|---|---|
| 8位 | -128 | 127 | 255 |
| 16位 | -32,768 | 32,767 | 65,535 |
| 32位 | -2,147,483,648 | 2,147,483,647 | 4,294,967,295 |
| 64位 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | 18,446,744,073,709,551,615 |
实际用途:颜色代码与 chmod
网页颜色 #FF8800 是红、绿、蓝三个字节 FF、88、00 连起来写,十进制是红255、绿136、蓝0(0x88 = 8×16 + 8 = 136)。 文件权限 755 按八进制读,每一位是读 r=4、写 w=2、执行 x=1 之和。
| 八进制 | 二进制 | 权限 |
|---|---|---|
| 0 | 000 | --- |
| 1 | 001 | --x |
| 2 | 010 | -w- |
| 3 | 011 | -wx |
| 4 | 100 | r-- |
| 5 | 101 | r-x |
| 6 | 110 | rw- |
| 7 | 111 | rwx |
例如 chmod 755:所有者7(rwx)、所属组5(r-x)、其他人5(r-x),即 rwxr-xr-x,二进制为 111 101 101。 chmod 644 是 rw-r--r--,只有所有者可写,所有人可读。
验算过的计算示例
- 二进制转十进制:10110101 = 128 + 32 + 16 + 4 + 1 = 181,十六进制为 B5(1011 = B,0101 = 5)。
- 十六进制转十进制:十六进制的 1F4 = 1×256 + 15×16 + 4 = 500。
- 八进制转二进制:八进制的 755 是二进制 111 101 101,把每一位展开成3位即可。
- 36进制:36进制的 ZZ = 35×36 + 35 = 1,295。反过来,3,000除以36得商83余12(C),83除以36得商2余11(B),所以3,000的36进制是 2BC。
- 大数:9,007,199,254,740,993 的十六进制是 20000000000001。若用JavaScript普通数值,会被舍入成 9,007,199,254,740,992(十六进制 20000000000000),而本工具用BigInt能精确到最后一位。
- 补码:-100 的8位表示是 256 − 100 = 156 = 9C;-1 的32位表示是 FFFFFFFF。200 超出有符号8位范围(-128~127),所以8位那一行不显示,16位那一行显示 00C8。
常见错误与局限
- 十六进制的大小写:a~f 与 A~F 是同一个值,输出统一为大写。
- 相似字符:数字0与字母O、数字1与小写字母l容易混淆,导致输入无效。出错时会提示是第几个字符有问题。
- 数字要符合进制:二进制只能用0和1,八进制只能用0~7。在二进制栏里输入2会被拒绝。
- 与字符编码转换不同:本工具改变的是数的写法,把文字转成ASCII或Unicode码点是另一类处理。
- 要先确定位宽:不指定位宽时,同一个二进制串可能表示多个不同的值,上面FF的例子就是如此。
如何使用转换结果
- 把颜色值或内存地址转成十进制写进代码,或把十进制转成十六进制与调试器的显示对照。
- 设计位掩码时,输入数值后看二进制栏,就能知道哪些位被置1。
- 做作业和考试题时,把自己的计算与按位权展开和除法过程对照检查。
- 像网址短码这样由字母和数字组成的短标识符,用36进制表示比十进制位数更短。
常见问题
可以转换负数或小数吗?
负整数可以,在开头加 - 即可,同时会显示8、16、32、64位的补码。不支持小数点,只处理整数。
为什么最大支持到36进制?
36进制用到0~9和A~Z(10~35),是只靠数字和字母就能书写的最大进制。网址缩短和短标识符生成等场合会用到,所以一并支持。
超大的数也能精确转换吗?
可以。JavaScript普通数值超过约 9×1015(253)后整数就不准确了,但本工具用BigInt计算,没有内置的位数上限。不过输入几千位以上时,浏览器可能变慢。
可以直接粘贴带 0x 或 0b 的值吗?
可以,放在对应的栏里即可。0x(十六进制)、0b(二进制)、0o(八进制)会被自动去掉,空格和下划线也会忽略,所以 1111_0000 这样的写法也行。
为什么十六进制的一位等于4位二进制?
因为 16 = 24。十六进制的一位取值0~15,正好与4位二进制能表示的16种值一一对应。同理,八进制的一位对应3位,32进制的一位对应5位。
补码表里为什么有些位宽不显示?
只显示能容纳该值的位宽。比如200超出有符号8位的范围(-128~127),所以表从16位开始。
相关工具
- 颜色代码转换:HEX、RGB、HSL 等互相转换
- Base64 编码解码工具:用文字表示字节的另一种方式
- 罗马数字转换器:不使用位值制的记数法
- 端口号大全:0~65535 范围的实际用途
本工具仅供学习和开发参考。涉及加密或安全的数值,请务必用成熟的库和官方规范进行验证。