进制转换就是同一个数换一种写法。我们平时用十进制,是因为有十根手指;计算机用二进制,是因为电路只有通和断两种状态;而十六进制是给人看的二进制缩写,写起来短、又容易和二进制互换。输入一个数,工具会同时在二进制、八进制、十进制、十六进制之间给出结果。
它不只是学生做题用的。调颜色、看内存地址、读接口返回的编码、排查乱码,都会碰到十六进制;下面把几种进制的分工和几个常被忽略的细节讲清楚。
四种常用进制,各自用在哪里
十进制是日常通用;二进制是计算机内部的真实表示,底层电路只有 0 和 1;八进制在早期系统里常见,现在主要用于 Unix 文件权限(比如 755);十六进制则是程序员的日常工具,用来紧凑地表示字节、颜色、内存地址和编码值。它们之间没有谁更先进,只是同一组数字在不同场合的书写习惯。理论上进制可以取 2 到 36 之间的任意整数,超过 10 的部分用字母 A 到 Z 依次代表 10 到 35。
十六进制为什么用 A 到 F,一位顶四位二进制
十进制只有 0 到 9 十个数字符号,要表示 10 到 15 就借用了字母 A 到 F。十六进制好用的根本原因在于 16 是 2 的 4 次方:一位十六进制刚好对应 4 位二进制,转换时可以每 4 位一组直接对照,不必反复做除法。而 8 位二进制(一个字节)恰好等于 2 位十六进制,所以用十六进制写字节特别整齐。这也是为什么颜色值、哈希值、内存地址几乎都用十六进制表示。
0b、0o、0x 前缀:写代码时的约定
在 C、JavaScript 等语言里,为了区分不同进制,约定用前缀标明:0b 表示二进制(如 0b1010)、0o 表示八进制(如 0o17)、0x 表示十六进制(如 0xFF)。不加前缀默认按十进制理解。这个约定来自 C 语言,被后来很多语言沿用。需要留意的是,不同语言对八进制前缀的处理历史上有过变化,写代码时最好显式带上前缀,避免歧义。十六进制里的字母 A 到 F 大小写都合法,0xff 和 0xFF 是同一个数。
一个字节等于两个十六进制字符:255 就是 FF
这是最实用的一个记忆点:1 字节 = 8 位二进制 = 2 位十六进制。8 位全为 1 时是二进制的 11111111,等于十进制的 255,也等于十六进制的 FF。所以一个字节的取值范围,用十进制说是 0 到 255,用十六进制说就是 00 到 FF。看到一串十六进制字符串,把它两位一组切开,每一组就是一个字节,这也是读编码值、排查乱码时最常用的手法。
大数字为什么不能直接算:2 的 53 次方减一与 BigInt
在 JavaScript 这类语言里,普通的数字是浮点数,能精确表示的整数上限是 2 的 53 次方减一,也就是 9007199254740991(即 Number.MAX_SAFE_INTEGER)。超过这个范围,再大的整数会丢失精度,末尾几位变得不可靠。而进制转换经常要处理很长的数(比如一长串哈希值、大整数 ID),用普通数字就会算错。解决办法是使用 BigInt——它能表示任意长度的整数,不丢精度。本工具在处理长整数时用的就是这种方式,所以长串也能得到准确结果。
几个常见换算,拿来就能用
颜色值 #FF0000 里的 FF 是 255,代表红色通道拉满;IP 地址里每个数字都在 0 到 255 之间,对应两个十六进制字符;文件权限 755 是八进制,拆开表示所有者、所属组、其他人各自的读写执行权限;Unicode 码位常写成 U+4E2D 这样的十六进制形式,对应汉字「中」。遇到这些场景,把数值丢进来换成二进制或十进制,往往比死记硬背更快。
延伸阅读:中文数字转换器
参考资料
常见问题
二进制怎么快速转成十六进制?
每 4 位二进制对应 1 位十六进制,从小数点向左或向右每 4 位分一组,不足的补零,再逐组对照即可。例如 11111111 分成 1111 和 1111,对应 FF。
十六进制里的字母大小写有区别吗?
没有。0xff 和 0xFF 表示同一个数,A 到 F 大小写都合法。不同编程语言和文档习惯不同,读代码时不必纠结大小写。