【计算机基础】深入理解进制及其转换

22 年 5 月 13 日 星期五 22:32
1350 字
7 分钟
阅读量 --

AI 摘要

✨ AI 生成

文章系统讲解了计算机中二进制、八进制、十进制与十六进制的特点及相互转换方法,涵盖整数小数转换口诀与Python实现。其价值在于帮助读者夯实计算机底层基础,理清进制逻辑,便于理解代码与内存分析。

一、 什么是进制?

在计算机科学中,**进制(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 没有整数次方关系,因此不适合用来辅助二进制表示。

二、 各进制的特点与表示

进制名称英文简写基数数字范围进位规则
十进制DEC100-9逢十进一
二进制BIN20, 1逢二进一
八进制OCT80-7逢八进一
十六进制HEX160-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 模拟这个过程:

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

结语

进制转换是计算机科学入门的基本功。理解二进制与八进制、十六进制之间的“三位/四位对应关系”,可以让我们在阅读底层代码、分析内存地址时更加得心应手。希望本文的梳理能帮你彻底理清进制的概念与转换逻辑。

文章标题:【计算机基础】深入理解进制及其转换

文章作者:超超

文章链接:https://www.43322.cn/2022/05/13/jsj-jinzhi[复制]

最后修改时间:


版权声明:商业性转载须事先联系站长并获得授权;在非商业用途下,您可在任何媒体以任何形式自由复制、分发、修改本作品或基于本作品进行再创作,但须完整注明原文出处及文章链接,且分发基于本作品产生的衍生作品时,必须采用与本作品相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。

评论