HandyTools Hub

← 全部指南

二进制、八进制、十进制、十六进制:开发者进制转换指南

2026-08-12

0xFF0b10100755255——这四种数字写法在代码、配置文件、权限、颜色值和网络地址里无处不在。每个程序员时间久了都会对二进制和十六进制产生一种”熟练”,但这种熟练往往是模式匹配而不是理解:你知道 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

0xF5F=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 用 0o0o755
  • 字符串转义里的 \x 是十六进制("\x41" 就是 “A”),\u 引入十六进制的 Unicode 码位

两个坑:裸前导零让 0755 在好几种语言里变成八进制,悄无声息地改变数值(010 = 8);而 0809 这种看着像八进制的字面量在严格模式下直接非法。拿不准就用显式前缀,并用转换器验证。

实际工作中的应用场景

  • 颜色#FF5733 是三个字节——调色就是十六进制 ↔ 十进制。
  • 权限chmod 755 是比特分组的八进制写法;chmod 计算器直接展示比特映射。
  • 字符编码:ASCII 的 A 是十进制 65 = 0x41 = 0b01000001ASCII 表把三列并排列出。
  • 容量与内存:文件大小混用十进制营销单位和二进制硬件单位——KB 与 KiB——这是另一场进制混乱,单位换算器可以理清。
  • 位标志:把选项打包成 FLAG_A | FLAG_B 的 API 本质是二进制;流畅地读 flags & 0b0100 就是流畅地读二进制位。

速查表

  • 任意进制 → 十进制:展开 数位 × 进制^位置 求和。
  • 十进制 → 任意进制:反复相除,余数从下往上读。
  • 十六进制 ↔ 二进制:一位 = 4 比特,纯查表,零计算。
  • 八进制 ↔ 二进制:一位 = 3 比特。
  • 地标值:0xFF=255,0x100=256,0b1000=8,0755(八进制)=493。
  • 前缀:0x 十六进制,0b 二进制,0o/前导0 八进制(前导零写法是遗留陷阱)。