进制转换

日常生活中我们使用十进制(0-9),但在计算机领域中,二进制(0-1)、八进制(0-7)和十六进制(0-9, A-F)更为常见。进制转换的核心是通过数学运算在不同基数(Base)之间转换数的表示形式。理解这一原理不仅是计算机科学的基础,也是编程、网络通信甚至密码学的必备技能。


为什么学习进制转换?

  1. 考试需求
    信息学竞赛(如CSP、NOI)中频繁出现进制转换题目。例如,2024年山东CSP-J第一轮测试中便有一道关于二进制与十六进制转换的单选题。

  2. 计算机原理基础
    计算机硬件基于二进制逻辑运行,而八进制、十六进制常用于简化二进制的表示(如内存地址、机器指令)。

  3. 编程实践
    编程中常需处理不同进制的数据(如Python的bin()hex()函数,C/C++的格式化输出)。

  4. 实际应用场景

    • 计算机系统:二进制用于硬件设计,十六进制简化调试(如内存地址显示为0x1A3F)。
    • 网络与编码:IPv6地址使用十六进制(如2001:0db8::ff00),ASCII码用十进制或十六进制表示字符。
    • 密码学:大数运算(如RSA密钥)常以十六进制存储。
  5. 装逼


进制转换的核心原理

一、进制的基本概念

  • 基数(Base):进制使用的符号数量。

    • 十进制(Base 10):0-9
    • 二进制(Base 2):0-1
    • 十六进制(Base 16):0-9 + A-F(A=10, B=11, …, F=15)
  • 权值(Positional Value)
    每一位数字的值由其位置决定,计算公式为:

例如,十进制数123可分解为:


二、进制转换方法

1. 其他进制 → 十进制(按权展开求和)

将每一位数字乘以基数的幂次后相加。
示例:二进制1011转十进制

2. 十进制 → 其他进制

  • 整数部分:除基取余法
    将十进制数反复除以目标进制基数,逆序排列余数。
    示例:十进制11转二进制
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      11 = 5 × 2 + 1   (余1)
    5 = 2 × 2 + 1 (余1)
    2 = 1 × 2 + 0 (余0)
    1 = 0 × 2 + 1 (余1)
    ```
    逆序余数得`1011`。

    - **小数部分:乘基取整法**
    将小数部分反复乘以目标进制基数,顺序记录整数部分。
    **示例**:十进制`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
    顺序排列得`0.101`。
    
    

3. 二进制 ↔ 八进制/十六进制

  • 二进制 → 八进制
    每3位二进制为一组(从右向左,不足补零),直接转换。
    示例101101101 1015 555_{(8)}

  • 二进制 → 十六进制
    每4位二进制为一组(从右向左,不足补零)。
    示例11011010110 11016 D6D_{(16)}

  • 反向转换
    将每位八进制/十六进制数展开为3/4位二进制。
    示例:十六进制A31010 001110100011


三、通用转换公式

所有进制转换均可通过以下公式实现:

  • ( B ):目标进制基数
  • ( d_k ):第( k )位的数字
  • ( n, m ):整数和小数部分的位数

总结与技巧

  1. 快速转换口诀

    • 二进制转十六进制:4位一组,查表转换。
    • 十进制转二进制:除2取余,逆序排列。
  2. 编程实现
    大多数编程语言提供内置函数(如Python的int("1011", 2)可直接将二进制转为十进制)。

  3. 避免错误

    • 补零对齐:分组转换时注意位数不足需补零(如二进制101转八进制需补零为1015)。
    • 小数精度:十进制小数转其他进制时可能无限循环(如0.1转二进制为无限循环0.000110011...)。

参考与扩展

Bryant, Randal E., and David R. O’Hallaron. Computer Systems: A Programmer’s Perspective. 3rd ed., Pearson, 2016.