进制转换器

在任意一栏输入数值,二进制、八进制、十进制、十六进制会同时转换。大整数和负数都能精确处理,2~36进制之间的转换还会展示计算过程。

0b、0o、0x前缀以及空格、下划线(_)会被自动忽略。在开头加 - 表示负数。仅支持整数。

任意进制转换(2~36进制)及计算过程

什么是进制?如何按位权读数

进制由“基数”决定:每一位能取多少种数字,以及相邻两位之间相差多少倍。十进制的“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 对照表

十进制二进制八进制十六进制
00000000
10000111
20001022
30001133
40010044
50010155
60011066
70011177
801000108
901001119
100101012A
110101113B
120110014C
130110115D
140111016E
150111117F
16100002010

十六进制的一位正好对应二进制的4位,八进制的一位对应3位。所以二进制转十六进制不需要计算:每4位分成一组,在表里查即可。 例如 1011 0101 分成 B 和 5,结果是 B5。反过来,把十六进制的每一位展开成4位二进制就行。

为什么计算机使用二进制

电子电路最容易稳定处理的是两种界限分明的状态,比如电压的高与低,因此以0和1的二进制为基础。但二进制位数太长,不便阅读, 所以内存地址、错误码、颜色值用能把4位合成一个字符的十六进制来写,Unix文件权限则用能把3位合成一个字符的八进制。 1,000用二进制是1111101000(10位),八进制是1750,十六进制是3E8,越来越短。

2的幂对照表

下表在构建页面时用BigInt计算,即使超过253也是准确的。

指数十进制十六进制
2^011
2^122
2^244
2^388
2^41610
2^53220
2^66440
2^712880
2^8256100
2^101,024400
2^124,0961000
2^1665,53610000
2^201,048,576100000
2^2416,777,2161000000
2^312,147,483,64880000000
2^324,294,967,296100000000
2^539,007,199,254,740,99220000000000000
2^639,223,372,036,854,775,8088000000000000000
2^6418,446,744,073,709,551,61610000000000000000

28 = 256 是一个字节能表示的值的个数(0~255),216 = 65,536 是端口号的个数(0~65535)。JavaScript的普通数值是64位浮点数, 只有在 253 − 1 = 9,007,199,254,740,991 以内才能准确表示每一个整数,超过后有些整数无法表示,所以本转换器用BigInt来计算。

精度、负数和小数的处理方式

负数与补码

计算机通常用补码存储负整数。在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位-128127255
16位-32,76832,76765,535
32位-2,147,483,6482,147,483,6474,294,967,295
64位-9,223,372,036,854,775,8089,223,372,036,854,775,80718,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 之和。

八进制二进制权限
0000---
1001--x
2010-w-
3011-wx
4100r--
5101r-x
6110rw-
7111rwx

例如 chmod 755:所有者7(rwx)、所属组5(r-x)、其他人5(r-x),即 rwxr-xr-x,二进制为 111 101 101。 chmod 644 是 rw-r--r--,只有所有者可写,所有人可读。

验算过的计算示例

  1. 二进制转十进制:10110101 = 128 + 32 + 16 + 4 + 1 = 181,十六进制为 B5(1011 = B,0101 = 5)。
  2. 十六进制转十进制:十六进制的 1F4 = 1×256 + 15×16 + 4 = 500。
  3. 八进制转二进制:八进制的 755 是二进制 111 101 101,把每一位展开成3位即可。
  4. 36进制:36进制的 ZZ = 35×36 + 35 = 1,295。反过来,3,000除以36得商83余12(C),83除以36得商2余11(B),所以3,000的36进制是 2BC。
  5. 大数:9,007,199,254,740,993 的十六进制是 20000000000001。若用JavaScript普通数值,会被舍入成 9,007,199,254,740,992(十六进制 20000000000000),而本工具用BigInt能精确到最后一位。
  6. 补码:-100 的8位表示是 256 − 100 = 156 = 9C;-1 的32位表示是 FFFFFFFF。200 超出有符号8位范围(-128~127),所以8位那一行不显示,16位那一行显示 00C8。

常见错误与局限

如何使用转换结果

常见问题

可以转换负数或小数吗?

负整数可以,在开头加 - 即可,同时会显示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位开始。

相关工具

本工具仅供学习和开发参考。涉及加密或安全的数值,请务必用成熟的库和官方规范进行验证。