核心答案:进制转换核心三组——十转二"除 2 取余倒着读"(25→11001),二转十六"4 位一组查表"(11111111→FF),十六转十"按位乘 16 的幂"(0xFF=255)。记住 0xFF=255、0x10=16、1024=2¹⁰ 三个锚点。
四种进制基础
| 进制 | 数字范围 | 前缀 | 例子 |
|---|---|---|---|
| 二进制 | 0-1 | 0b | 0b1010=10 |
| 八进制 | 0-7 | 0o | 0o17=15 |
| 十进制 | 0-9 | 无 | 42 |
| 十六进制 | 0-9 A-F | 0x | 0x2A=42 |
十进制转二进制(除 2 取余)
| 除法 | 商 | 余数 |
|---|---|---|
| 25÷2 | 12 | 1 ↑ |
| 12÷2 | 6 | 0 ↑ |
| 6÷2 | 3 | 0 ↑ |
| 3÷2 | 1 | 1 ↑ |
| 1÷2 | 0 | 1 ↑ |
余数从下往上读:25 = 0b11001 ✓(16+8+1=25)
二进制与十六进制互转(4 位一组)
二进制的 4 位恰好是十六进制的 1 位(2⁴=16):
| 二进制 | 十六进制 | 十进制 |
|---|---|---|
| 0000-0111 | 0-7 | 0-7 |
| 1000 | 8 | 8 |
| 1010 | A | 10 |
| 1111 | F | 15 |
例:0b11111111 = 1111 1111 → 0xFF = 255;0x3C = 0011 1100 = 0b111100 = 60。
实战应用场景
| 场景 | 进制 | 例子 |
|---|---|---|
| 颜色值 | 十六进制 | #FF8800 = rgb(255,136,0) |
| 权限 chmod | 八进制 | 755 = rwxr-xr-x |
| IP/子网 | 二进制 | 255.255.255.0=/24 |
| 内存地址 | 十六进制 | 0x7FFF5FBFF8A8 |
| 位运算掩码 | 二进制 | flags & 0b0100 |
补码与负数
计算机用补码存负数:−x = 按位取反 + 1。
- 8 位系统中 −1 = 0b11111111(即 0xFF)
- 这就是为什么 byte 溢出时 127+1 变成 −128
- 位运算 ~5 = −6(取反后解释为有符号数)
常见误区
- 0x10 读作"十":0x10 = 16!十六进制的 10 是十六。
- A-F 大小写混淆:0xFF 与 0xff 等值,代码规范通常大写。
- 八进制前导 0:老代码里 0755 是八进制,010 = 8 不是 10(JS 已废弃这种写法)。
- 手转大数硬算:大数用"除 16 取余"或编程工具,别硬除 2。
用[进制转换工具](/c/dev/base-convert)在二/八/十/十六进制间实时互转。