进制转换:从二进制、八进制、十六进制到十进制的速算
这一篇把「二进制、八进制、十进制、十六进制」之间的相互转换整理成一份速查表,每一种都配一个具体例子的手工计算步骤。
记号约定:
- 数字后缀 (B)=二进制、(O)=八进制、(D)=十进制、(H)=十六进制
- 十六进制字母 (\text{A}=10)、(\text{B}=11)、(\text{C}=12)、(\text{D}=13)、(\text{E}=14)、(\text{F}=15)
一、四个核心概念
1. 基数
进制就是「每一位上能用几个数字」。每进一位就乘一次基数 (r):
| 进制 | 基数 (r) | 数字范围 |
|---|---|---|
| 二进制 (B) | 2 | 0, 1 |
| 八进制 (O) | 8 | 0 ~ 7 |
| 十进制 (D) | 10 | 0 ~ 9 |
| 十六进制 (H) | 16 | 0 ~ F |
2. 位权
第 (i) 位(从右往左,从 (0) 开始数)的权值是 (r^i)。例如二进制 10110(5 位)的位权依次是 (2^4, 2^3, 2^2, 2^1, 2^0):
1 | 位号: 4 3 2 1 0 |
3. 按权展开(任意进制 → 十进制的通用公式)
[
(N)r = \sum{i=0}^{k-1} d_i \cdot r^i
[其中 (d_i) 是第 (i) 位上的数字,(r) 是基数,(k) 是位数。
4. 整数部分与小数部分分开做
进制转换对整数部分和小数部分用的是两套规则,永远分开算:
| 部分 | 规则 | 方向 |
|---|---|---|
| 整数 | 除 (r) 取余,倒序排列 | 任何进制 ↔ 十进制 |
| 小数 | 乘 (r) 取整,正序排列 | 十进制 ↔ 任何进制 |
二、整数部分转换
2.1 二进制 → 十进制:按权展开
例:(10110_{(B)} = ?)
按权展开(与上表对应):]
10110{(B)} = 1 \times 2^4 + 0 \times 2^3 + 1 \times 2^2 + 1 \times 2^1 + 0 \times 2^0 = 16 + 0 + 4 + 2 + 0 = 22{(D)}
[### 2.2 二进制 → 八进制:「421 法」
每 3 位一组(从右往左分),不够的左侧补 0。每组按 (4, 2, 1) 三位权重相加。
例:(10110_{(B)})
1 | 原始: 1 0 1 1 0 |
所以 (10110{(B)} = 26{(O)})。
421 法速记:每组只有 3 位,所以权重就是 (4 = 2^2)、(2 = 2^1)、(1 = 2^0)。记不住展开式就直接写 421。
2.3 二进制 → 十六进制:「8421 法」
每 4 位一组(从右往左分),不够的左侧补 0。每组按 (8, 4, 2, 1) 四位权重相加;如果和 ≥ 10,转换成 A~F。
例:(101101_{(B)})
1 | 原始: 1 0 1 1 0 1 |
所以 (101101{(B)} = 2D{(H)})。
2.4 十进制 → 二进制:短除法
除 2 取余,倒序排列。
例:(26{(D)} = ?{(B)})
1 | 商 余数 |
倒序读余数:(11010{(B)})。所以 (26{(D)} = 11010_{(B)})。
「除到 0 为止」:商变成 0 就停,最后一个 1 是被 2 除出来的,不是循环的一部分。
2.5 八进制 → 二进制:每位展 3 位
每位八进制数字对应 3 位二进制(421 法反过来),不够 3 位的左侧补 0。
例:(26{(O)} = ?{(B)})
1 | 八进制每位: 2 6 |
拼起来:(010110{(B)})。所以 (26{(O)} = 010110_{(B)})。
2.6 十六进制 → 二进制:每位展 4 位
每位十六进制数字对应 4 位二进制(8421 法反过来),不够 4 位的左侧补 0。
例:(5C2{(H)} = ?{(B)})
1 | 十六进制每位: 5 C(=12) 2 |
拼起来:(0101\,1100\,0010_{(B)})。
2.7 通用公式:十进制 ↔ 任意进制 (r)
| 方向 | 公式 |
|---|---|
| (r) 进制 → 十进制 | 按权展开:(N = \sum d_i r^i) |
| 十进制 → (r) 进制 | 除 (r) 取余,倒序 |
对于 (r = 8)、(r = 16) 来说,这套规则都成立,只是运算慢、不如「二进制中转」快。
三、小数部分转换
3.1 二进制 → 十进制:还是按权展开
只不过小数位的权值是 (r^{-i})。
例:(11.101{(B)} = ?{(D)})
[
1 \times 2^1 + 1 \times 2^0 + 1 \times 2^{-1} + 0 \times 2^{-2} + 1 \times 2^{-3}
= 2 + 1 + 0.5 + 0 + 0.125 = 3.625_{(D)}
]
3.2 十进制 → 二进制:乘 2 取整
整数部分仍用「除 2 取余」,小数部分用「乘 2 取整」,正向排列。
例:(0.625{(D)} = ?{(B)})
1 | 整数 小数 |
正序读整数部分:(101{(B)})。所以 (0.625{(D)} = 0.101_{(B)})。
何时停止:小数部分变成 0 就停。如果一直不变成 0(比如 (0.1_{(D)})),就只能取到你想要的精度为止。
3.3 二进制小数 ↔ 八进制、十六进制小数
按整数部分同样的「分组法」做,只是从小数点开始往两边分组:
| 转换 | 分组方向 | 起点 |
|---|---|---|
| 二进制小数 → 八进制 | 小数点起向左、向右每 3 位一组 | 小数点 |
| 二进制小数 → 十六进制 | 小数点起向左、向右每 4 位一组 | 小数点 |
例:(11.101{(B)} = ?{(O)})
1 | 11.101 |
所以 (11.101{(B)} = 3.5{(O)})。
四、八进制 ↔ 十进制
4.1 十进制 → 八进制
两种方法:
- 间接法:先转二进制,再 3 位 1 组转八进制
- 直接法:除 8 取余,倒序排列(与十进制 → 二进制一模一样,只是除数换成 8)
例:(26{(D)} = ?{(O)})
1 | 直接法: |
所以 (26{(D)} = 32{(O)})。
4.2 八进制 → 十进制
- 间接法:先转二进制,再按权展开
- 直接法:按权展开((8^i) 为权)
五、十进制 ↔ 十六进制
与八进制完全对称,只是基数换成 16。
例:(43{(D)} = ?{(H)})
1 | 直接法: |
所以 (43{(D)} = 2B{(H)})。
反过来 (2B{(H)} = 2 \times 16 + 11 = 32 + 11 = 43{(D)})。
六、记忆口诀表
| 想做的事 | 公式 / 方法 |
|---|---|
| 任意进制 → 十进制 | 按权展开((d_i \cdot r^i) 求和) |
| 十进制 → 任意进制(整数) | 除 (r) 取余,倒序排列 |
| 十进制 → 任意进制(小数) | 乘 (r) 取整,正序排列 |
| 二进制 ↔ 八进制 | 421 法:3 位一组 |
| 二进制 ↔ 十六进制 | 8421 法:4 位一组 |
| 八进制 ↔ 十六进制 | 走二进制:先 ↔ 二进制,再 ↔ 另一边 |
记住「按权展开 + 短除法」这两个最根本的,剩下的 421 / 8421 都是在它们基础上简化而来。
七、易错点清单
- 分组时忘记补 0:从右往左分,不够 3 位(或 4 位)要左侧补 0,不能右侧补。
- 小数部分从左往右分:整数分组从右往左、小数分组从左往右,方向别搞反。
- 十六进制字母写错:(11 = B)、(12 = C)、(13 = D)……不是 (B = 12)。
- 十进制小数转二进制乘 2 取整时忘了停止条件:乘到小数部分变 0 才停,否则位数会无限。
- 短除法算到最后商变 0 但忘了取最后一个余数:最后那个余数 (1)(除以基数前的最后一位)一定要写上。