进制转换完全指南:二进制、八进制、十进制、十六进制互转原理与实践

为什么程序员离不开进制转换

计算机底层只认识 0 和 1,但人类阅读二进制极其痛苦。于是有了八进制、十进制、十六进制等多种表示方式。程序员在日常工作中频繁需要在这些进制间转换:

  • CSS 颜色值 #FF5733 与 RGB 数值互转
  • Linux 文件权限 755 对应的二进制位掩码
  • 嵌入式开发中硬件寄存器的十六进制地址
  • 内存地址、文件偏移量的十六进制与十进制换算
  • 网络协议中的字节序列分析

理解进制转换的原理,是编程基础的重要一环。

配套工具:进制转换工具

一、四种进制的对应关系

1.1 进制定义

进制基数字符集前缀典型场景
二进制20-10b位运算、逻辑判断
八进制80-70oLinux 文件权限
十进制100-9日常计算
十六进制160-9、a-f0x颜色值、内存地址

1.2 数值对照表

十进制二进制八进制十六进制
0000
81000108
10101012A
16100002010
17210101100254AC
25511111111377FF

1.3 为什么十六进制最常用

二进制太长(一个字节就要 8 位),十进制与字节没有自然的对应关系。而每 4 位二进制恰好对应 1 位十六进制,这意味着 1 个字节刚好用 2 位十六进制表示。这种 1:4 的对应关系使十六进制成为表示二进制数据最紧凑、最直观的方式。

二、进制转换的数学原理

2.1 任意进制转十进制:按权展开

将 N 进制数转为十进制,只需将每一位乘以对应的权值(基数的幂次)后求和:

二进制 10101100 → 1×2^7 + 0×2^6 + 1×2^5 + 0×2^4 + 1×2^3 + 1×2^2 + 0×2^1 + 0×2^0
                → 128 + 32 + 8 + 4 = 172

十六进制 AC → 10×16^1 + 12×16^0 = 160 + 12 = 172

2.2 十进制转任意进制:除基取余

将十进制数转为 N 进制,反复除以 N,记录余数,余数逆序排列即为结果:

172 ÷ 2 = 86 余 0
 86 ÷ 2 = 43 余 0
 43 ÷ 2 = 21 余 1
 21 ÷ 2 = 10 余 1
 10 ÷ 2 =  5 余 0
  5 ÷ 2 =  2 余 1
  2 ÷ 2 =  1 余 0
  1 ÷ 2 =  0 余 1
逆序:10101100

2.3 二进制与八进制/十六进制的快速转换

由于 8=2^3、16=2^4,二进制与八进制/十六进制之间有直接的位对应关系:

  • 二进制 → 八进制:每 3 位一组,直接查表对应
  • 二进制 → 十六进制:每 4 位一组,直接查表对应
二进制 10101100
→ 按 4 位分组:1010 1100
→ 十六进制:   A    C
→ 结果:AC

三、BigInt:突破 JavaScript 的精度限制

3.1 Number 类型的精度陷阱

JavaScript 的 Number 是 64 位浮点数(IEEE 754),能精确表示的最大整数是 2^53 - 1 = 9007199254740991(即 Number.MAX_SAFE_INTEGER)。超过这个值会出现精度丢失:

Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2  // true(本应 false)
9007199254740993 === 9007199254740992  // true(精度丢失)

3.2 BigInt 的优势

BigInt 是 JavaScript 的原生大整数类型,可以表示任意精度的整数:

const big = 9007199254740993n;
big + 1n === big + 2n  // false(精确计算)

进制转换工具使用 BigInt 处理所有数值,确保颜色值、哈希值、大整数 ID 等场景的转换结果精确无误。

3.3 BigInt 的进制转换

BigInt 原生支持 toString(radix) 方法输出指定进制:

(172n).toString(2)   // "10101100"
(172n).toString(16)  // "ac"
(172n).toString(8)   // "254"

但从字符串解析时,BigInt() 构造函数只接受十进制字面量,非十进制字符串需要手动按权展开解析。

四、编程语言中的进制字面量

4.1 前缀表示法

主流编程语言使用前缀区分进制:

前缀进制示例支持语言
0b / 0B二进制0b10101100JavaScript、Python、Rust、Java
0o / 0O八进制0o254JavaScript、Python、Rust
0x / 0X十六进制0xAC所有主流语言
无前缀十进制172所有语言

4.2 历史陷阱:0 前缀

在早期的 C 语言和 JavaScript(ES5 前)中,以 0 开头的数字会被解释为八进制:

// 旧版 JavaScript(已废弃)
010  // 8(八进制,不是十进制 10)

// 现代 JavaScript
0o10  // 8(显式八进制前缀)
010   // 严格模式下报错,非严格模式下仍为 8(已废弃用法)

现代编程语言统一使用 0o 前缀表示八进制,避免歧义。进制转换工具会自动识别并剥离这些前缀。

五、典型应用场景

5.1 颜色值换算

CSS 颜色值使用十六进制表示,每两位对应一个 RGB 通道:

#FF5733
→ R = 0xFF = 255
→ G = 0x57 = 87
→ B = 0x33 = 51

5.2 权限位掩码

Linux 文件权限用八进制表示,每位数字对应一个用户类别的读/写/执行权限:

755
→ 所有者:7 = 111 (rwx)
→ 所属组:5 = 101 (r-x)
→ 其他人:5 = 101 (r-x)

5.3 寄存器调试

嵌入式开发中,硬件寄存器地址和值常用十六进制表示,位掩码用二进制分析:

寄存器地址:0x40021000
寄存器值:  0x000000FF
二进制:    0000...11111111(低 8 位全 1)

六、总结

进制转换是编程的基础能力,理解原理比死记公式更重要:

  1. 按权展开:任意进制转十进制的通用方法
  2. 除基取余:十进制转任意进制的通用方法
  3. 位对应:二进制与八进制(3 位)、十六进制(4 位)有直接对应关系
  4. BigInt:JavaScript 中处理大数进制转换的必备工具
  5. 前缀识别:0b/0o/0x 是现代编程语言的进制标识

需要快速转换时,可以使用 进制转换工具,支持 BigInt 超大整数和前缀自动识别。