二进制、八进制、十进制、十六进制:开发者进制转换指南
2026-08-12
0xFF、0b1010、0755、255——这四种数字写法在代码、配置文件、权限、颜色值和网络地址里无处不在。每个程序员时间久了都会对二进制和十六进制产生一种”熟练”,但这种熟练往往是模式匹配而不是理解:你知道 0xFF 是 255,是因为见过一千次,而不是因为转换过程显而易见。这篇文章把真正的理解补上——“进制”到底是什么、任意两种进制之间怎么转换,以及让十六进制和二进制用起来像十进制一样自然的心算捷径。
“进制”到底是什么
上面这些计数系统都是同一个思想换个宽度:位置记数法。十进制的 255 意思是 2×100 + 5×10 + 5×1——每个数位的值是面值乘以 10 的某次幂,幂次由位置决定。把乘数从 10 的幂换成某个数 b 的幂,就得到了 b 进制。你需要恰好 b 个不同的数字符号:
- 二进制(base 2):数字 0–1,2 的幂。
- 八进制(base 8):数字 0–7,8 的幂。
- 十进制(base 10):数字 0–9,10 的幂。
- 十六进制(base 16):数字 0–9 加 A–F 表示 10–15,16 的幂。
所以二进制的 1010 意思是 1×8 + 0×4 + 1×2 + 0×1 = 10,十六进制的 FF 意思是 15×16 + 15×1 = 255。这一个展开式——数位乘以进制的位置次幂再求和——就是所有转换公式的本体。任意进制转十进制,真的就是把这个和写出来。
为什么程序员活在二进制和十六进制里
计算机用比特存储一切,二进制是底层真相——但原始二进制稍微长一点就没法读:11111111 已经费眼,32 位的值更是灾难。十六进制能解决,全靠一个美丽的巧合:16 是 2⁴,所以一个十六进制位恰好映射四个二进制位(一个 nibble)。十六进制 ↔ 二进制的转换完全不需要算术,只要一张 16 行的查表:
0=0000 1=0001 2=0010 3=0011 4=0100 5=0101 6=0110 7=0111
8=1000 9=1001 A=1010 B=1011 C=1100 D=1101 E=1110 F=1111
0xF5 → F=1111,5=0101 → 11110101。反过来,把二进制从右往左每四位分组,逐组翻译。这就是为什么任何需要人眼读原始字节的地方都用十六进制:内存地址、MAC 地址、颜色值(#FF5733 就是三个字节)、文件魔数、哈希值。一个字节 = 两个十六进制位,永远如此。
八进制的存在基于同样道理,只是三位一组(8 = 2³):一个八进制位 = 三个比特。它在现代的主要栖息地是 Unix 文件权限——chmod 755 就是三组三个比特(读/写/执行)。十进制则始终是人类思考的语言,这就是为什么”转回十进制”是另一个日常需求。
转成十进制:展开求和
任意进制 → 十进制的通用方法就是位置展开:
0x2F = 2×16 + 15 = 47
0b1010 = 1×8 + 1×2 = 10
0o755 = 7×64 + 5×8 + 5 = 493
对十六进制,一个有用的反射是记住”地标”值:0x10=16、0x20=32、0x40=64、0x80=128、0xFF=255、0x100=256。实际遇到的十六进制大多在某个地标附近,所以 0xF5 是”比 0xFF 小一点”≈ 245(精确值就是 245;验证:15×16+5)。需要快速精确转换时,进制转换器支持二进制、八进制、十进制、十六进制双向互转。
从十进制转出:除基取余
十进制 → 任意进制用反复除以目标进制的方法;余数倒着读就是结果:
247 ÷ 16 = 15 余 7 → 7
15 ÷ 16 = 0 余 15 → F
从下往上读:0xF7
十进制转二进制有个多数开发者更喜欢的捷径:减 2 的幂。把 1、2、4、8、16、32、64、128 背熟。转 247:减 128(剩 119),减 64(剩 55),减 32(剩 23),减 16(剩 7),跳过 8,减 4(剩 3),减 2(剩 1),减 1。置位的位置是 7、6、5、4、2、1、0 → 11110111。用十六进制验证:11110111 = F7。✓
各语言里的前缀写法
同样的值在不同上下文里穿不同的”前缀马甲”:
0x或#前缀 = 十六进制(C/Java/JS/Python 里的0xFF,CSS 里的#FF5733,很多工具里直接裸写FF5733)0b= 多数现代语言的二进制;有些是0B- 前导
0= C 和旧式 JavaScript 的八进制(0755);Python 和现代 JS 用0o(0o755) - 字符串转义里的
\x是十六进制("\x41"就是 “A”),\u引入十六进制的 Unicode 码位
两个坑:裸前导零让 0755 在好几种语言里变成八进制,悄无声息地改变数值(010 = 8);而 08、09 这种看着像八进制的字面量在严格模式下直接非法。拿不准就用显式前缀,并用转换器验证。
实际工作中的应用场景
- 颜色:
#FF5733是三个字节——调色就是十六进制 ↔ 十进制。 - 权限:
chmod 755是比特分组的八进制写法;chmod 计算器直接展示比特映射。 - 字符编码:ASCII 的
A是十进制 65 =0x41=0b01000001;ASCII 表把三列并排列出。 - 容量与内存:文件大小混用十进制营销单位和二进制硬件单位——KB 与 KiB——这是另一场进制混乱,单位换算器可以理清。
- 位标志:把选项打包成
FLAG_A | FLAG_B的 API 本质是二进制;流畅地读flags & 0b0100就是流畅地读二进制位。
速查表
- 任意进制 → 十进制:展开
数位 × 进制^位置求和。 - 十进制 → 任意进制:反复相除,余数从下往上读。
- 十六进制 ↔ 二进制:一位 = 4 比特,纯查表,零计算。
- 八进制 ↔ 二进制:一位 = 3 比特。
- 地标值:
0xFF=255,0x100=256,0b1000=8,0755(八进制)=493。 - 前缀:
0x十六进制,0b二进制,0o/前导0八进制(前导零写法是遗留陷阱)。