计算机的世界充满了进制的影子:CSS 里的 #1A2B3C、内存地址 0x7FFFFFFF、Base64 编码、URL 的 %20……这些看似神秘的字符串,背后都是同一个概念——进制(Number Systems)。理解它,你就能读懂更多底层技术的逻辑。
一、什么是进制?
进制是"用多少个符号来表示数字"的规则。我们日常使用十进制(Base-10),因为有 0–9 共 10 个符号;当数到 9 的下一个,就"进位"变成 10。
同理:
- 二进制(Base-2):只有 0 和 1,数到 1 的下一个就进位,变成 10(读作"一零",代表十进制的 2)
- 八进制(Base-8):符号 0–7,数到 7 下一个进位
- 十六进制(Base-16):符号 0–9 加上 A–F(A=10, B=11, …, F=15),数到 F 下一个进位
| 十进制 | 二进制 | 八进制 | 十六进制 |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 1 | 0001 | 1 | 1 |
| 8 | 1000 | 10 | 8 |
| 10 | 1010 | 12 | A |
| 15 | 1111 | 17 | F |
| 16 | 10000 | 20 | 10 |
| 255 | 11111111 | 377 | FF |
二、二进制(Base-2)
二进制是计算机硬件的语言。电路只有"通电"与"断电"两种状态,正好对应 1 和 0。每一个 0 或 1 称为一个位(bit),8 个位组成一个字节(byte)。
十进制转二进制
方法:反复除以 2,记录余数,由下往上读。
13 ÷ 2 = 6 余 1 ↑
6 ÷ 2 = 3 余 0 ↑
3 ÷ 2 = 1 余 1 ↑
1 ÷ 2 = 0 余 1 ↑
结果:1101(十进制 13 = 二进制 1101)
二进制转十进制
方法:每一位乘以 2 的对应次方,加总。
1101 = 1×2³ + 1×2² + 0×2¹ + 1×2⁰
= 8 + 4 + 0 + 1
= 13
三、十六进制(Base-16)
十六进制是编程中最常见的进制,因为它和二进制之间有完美的对应关系:每 4 个位恰好对应一个十六进制数字。
二进制:1111 1010 1011 1100
十六进制: F A B C → FABC
这让十六进制成为表达内存地址、颜色码、哈希值的理想格式——既比二进制短,又和底层二进制有直接的对应。
十进制转十六进制
方法:反复除以 16,余数 10–15 用 A–F 表示。
255 ÷ 16 = 15 余 15(F) ↑
15 ÷ 16 = 0 余 15(F) ↑
结果:FF(十进制 255 = 十六进制 FF)
实际案例:CSS 颜色码
CSS 颜色码 #FF5733 是三对十六进制数字,分别代表 R(红)、G(绿)、B(蓝):
| 色码 | 十六进制 | 十进制(0–255) |
|---|---|---|
| 红(R) | FF | 255 |
| 绿(G) | 57 | 87 |
| 蓝(B) | 33 | 51 |
因此 #FF5733 等同于 rgb(255, 87, 51)——一种偏橘红的颜色。
四、URL 编码中的十六进制
URL 只允许特定字符,不允许的字符(如空格、中文、特殊符号)必须用百分比编码(Percent Encoding)表示:将字符的 UTF-8 字节转为十六进制,前面加 %。
| 原始字符 | URL 编码 | 说明 |
|---|---|---|
| 空格 | %20 | 十六进制 20 = 十进制 32(空格的 ASCII 码) |
| / | %2F | 斜线在路径之外需编码 |
| 中 | %E4%B8%AD | UTF-8 编码为 3 个字节 |
| @ | %40 | 在某些 URL 部分需编码 |
五、Base64:另一种常见的编码方式
Base64 并非进制,而是一种将二进制数据转为可打印文字的编码方式。它把每 3 个 byte(24 bits)分成 4 组 6-bit,每组对应 64 个字符之一(A–Z、a–z、0–9、+、/)。
原始(ASCII):Man
二进制:01001101 01100001 01101110
分组(6-bit):010011 010110 000101 101110
Base64: T W F u → TWFu
Base64 输出比原始数据大约 33%(每 3 bytes 变 4 字符),但能安全地在只支持文字的管道(如 email、HTML 属性、JSON)中传输二进制数据。
六、进制在编程中的实际应用
内存地址
调试工具和内存转储通常以十六进制显示地址,例如 0x7FFE1234。前缀 0x(C/C++/Python/JS)、#(CSS)或 0b(二进制)是编程语言标示进制的常见方式。
位掩码(Bitmask)
Unix 文件权限用八进制表示,如 chmod 755:
7 = 111(二进制)= 读(4) + 写(2) + 执行(1)
5 = 101(二进制)= 读(4) + 执行(1)
5 = 101(二进制)= 读(4) + 执行(1)
哈希输出
MD5 输出 128 bits,以 32 个十六进制字符表示(每个字符 = 4 bits);SHA-256 输出 256 bits,以 64 个十六进制字符表示。
七、各语言中的进制表示
| 语言 | 二进制 | 八进制 | 十六进制 |
|---|---|---|---|
| Python | 0b1010 | 0o12 | 0xA |
| JavaScript | 0b1010 | 0o12 | 0xA |
| C / C++ | —(无原生语法) | 012 | 0xA |
| Java | 0b1010 | 012 | 0xA |
| CSS | — | — | #FF5733 |
总结
进制不是艰深的理论,而是理解许多日常技术的钥匙:
- 二进制是计算机底层的语言,位运算的基础
- 十六进制是编程的通用语,颜色码、内存地址、哈希值都用它表示
- Base64 建立在二进制之上,解决了二进制数据在文字环境中传输的问题
- URL 编码用十六进制标记不允许的字符,让网址可以包含任意文字
理解这些基础后,你看到 %E4%B8%AD、#FF5733、TWFu 这些字符串,就能立刻读懂它们代表的意义。