一、 什么是进制?
在计算机科学中,**进制(Base / Radix)**是人为定义的带进位的计数方法。简单来说,就是我们数数的方式。对于任意一种 X 进制,它表示每一位置上的数运算时都是“逢 X 进一”。
在日常生活中,我们最熟悉的是十进制(逢十进一)。而在计算机底层,由于逻辑电路通常只有“接通”与“断开”两种状态,这两种状态恰好可以用二进制的 1 和 0 来表示,同时也能完美对应逻辑学中的“真(True)”与“假(False)”。因此,二进制成为了计算机最基础、最底层的核心进制。
为什么要有八进制和十六进制?
既然计算机底层只能识别二进制,为何还要引入八进制和十六进制?
- 简化书写:二进制只有
0和1,动辄长达几十位,难以记录和阅读。 - 数学关系:八进制的基数是 8,十六进制的基数是 16。它们与二进制的基数 2 存在整数次方关系:(8 = 2^3),(16 = 2^4)。这意味着每 3 位二进制可以完美对应 1 位八进制,每 4 位二进制可以完美对应 1 位十六进制。而十进制的基数 10 与 2 没有整数次方关系,因此不适合用来辅助二进制表示。
二、 各进制的特点与表示
| 进制名称 | 英文简写 | 基数 | 数字范围 | 进位规则 |
|---|---|---|---|---|
| 十进制 | DEC | 10 | 0-9 | 逢十进一 |
| 二进制 | BIN | 2 | 0, 1 | 逢二进一 |
| 八进制 | OCT | 8 | 0-7 | 逢八进一 |
| 十六进制 | HEX | 16 | 0-9, A-F | 逢十六进一 |
[!NOTE] 在十六进制中,因为需要表示 10 到 15,所以我们借用字母 A-F 来替代:A=10, B=11, C=12, D=13, E=14, F=15。
三、 进制转换的核心方法
1. 十进制转任意进制(整数部分)
核心口诀:除基取余,逆序排列
将十进制数不断除以目标进制的基数,直到商为 0,然后将每次得到的余数从下往上排列。
示例:将十进制 43 转换为二进制
- 43 ÷ 2 = 21 余 1
- 21 ÷ 2 = 10 余 1
- 10 ÷ 2 = 5 余 0
- 5 ÷ 2 = 2 余 1
- 2 ÷ 2 = 1 余 0
- 1 ÷ 2 = 0 余 1
- 逆序读取余数:
101011。 - 所以,
43(10) = 101011(2)
2. 任意进制转十进制(整数部分)
核心口诀:按权展开,相加求和
将目标进制数的每一位数字,乘以基数的幂次(从右往左,幂次从 0 开始递增),然后求和。
示例:将二进制 101011 转换为十进制
(1 \times 25 + 0 \times 24 + 1 \times 23 + 0 \times 22 + 1 \times 21 + 1 \times 20)
(= 32 + 0 + 8 + 0 + 2 + 1)
(= 43)
所以,101011(2) = 43(10)
3. 十进制转任意进制(小数部分)
核心口诀:乘基取整,顺序排列
将十进制小数不断乘以目标进制的基数,取出乘积的整数部分,再用剩下的小数部分继续乘,直到小数部分为 0 或达到所需精度为止。
示例:将十进制 0.625 转换为二进制
- 0.625 × 2 = 1.25,取整为 1,剩 0.25
- 0.25 × 2 = 0.5,取整为 0,剩 0.5
- 0.5 × 2 = 1.0,取整为 1,剩 0
- 顺序读取整数部分:
101。 - 所以,
0.625(10) = 0.101(2)
[!TIP] 很多十进制小数转换为二进制时是无限循环的(如 0.56)。此时需要设定一个精度要求(例如保留小数点后 5 位),达到精度后停止计算并舍入。 0.56 × 2 = 1.12 (取1) → 0.12 × 2 = 0.24 (取0) → 0.24 × 2 = 0.48 (取0) → 0.48 × 2 = 0.96 (取0) → 0.96 × 2 = 1.92 (取1) 因此
0.56(10) ≈ 0.10001(2)
4. 任意进制转十进制(小数部分)
核心口诀:按负权展开,相加求和
从小数点后开始,依次乘以基数的负一次方、负二次方、负三次方等,然后求和。
示例:将二进制 0.101 转换为十进制
(1 \times 2^{-1} + 0 \times 2^{-2} + 1 \times 2^{-3})
(= 0.5 + 0 + 0.125)
(= 0.625)
所以,0.101(2) = 0.625(10)
综合示例:将 5.625 转换为二进制
整数部分 5 转二进制为 101,小数部分 0.625 转二进制为 101。
组合起来:5.625(10) = 101.101(2)
四、 进制转换的算法实现(Python)
在 Python 中,进制转换非常方便,既可以使用内置函数,也可以手动实现算法。
1. 使用内置函数
- 十进制转其他进制:
bin(43)->'0b101011',oct(43)->'0o53',hex(43)->'0x2b' - 其他进制转十进制:使用
int()函数,指定base参数。例如int('101011', 2)->43
2. 手动实现(以十进制转任意进制为例)
使用“除基取余”的算法思想,可以用 Python 模拟这个过程:
def decimal_to_base(n, base):
if n == 0:
return "0"
digits = "0123456789ABCDEF"
res = []
while n > 0:
res.append(digits[n % base])
n //= base
return "".join(reversed(res))
# 测试
print(decimal_to_base(43, 2)) # 输出: 101011
print(decimal_to_base(43, 16)) # 输出: 2B
结语
进制转换是计算机科学入门的基本功。理解二进制与八进制、十六进制之间的“三位/四位对应关系”,可以让我们在阅读底层代码、分析内存地址时更加得心应手。希望本文的梳理能帮你彻底理清进制的概念与转换逻辑。