进制转换
进制转换
日常生活中我们使用十进制(0-9),但在计算机领域中,二进制(0-1)、八进制(0-7)和十六进制(0-9, A-F)更为常见。进制转换的核心是通过数学运算在不同基数(Base)之间转换数的表示形式。理解这一原理不仅是计算机科学的基础,也是编程、网络通信甚至密码学的必备技能。
为什么学习进制转换?
-
考试需求
信息学竞赛(如CSP、NOI)中频繁出现进制转换题目。例如,2024年山东CSP-J第一轮测试中便有一道关于二进制与十六进制转换的单选题。 -
计算机原理基础
计算机硬件基于二进制逻辑运行,而八进制、十六进制常用于简化二进制的表示(如内存地址、机器指令)。 -
编程实践
编程中常需处理不同进制的数据(如Python的bin()
、hex()
函数,C/C++的格式化输出)。 -
实际应用场景
- 计算机系统:二进制用于硬件设计,十六进制简化调试(如内存地址显示为
0x1A3F
)。 - 网络与编码:IPv6地址使用十六进制(如
2001:0db8::ff00
),ASCII码用十进制或十六进制表示字符。 - 密码学:大数运算(如RSA密钥)常以十六进制存储。
- 计算机系统:二进制用于硬件设计,十六进制简化调试(如内存地址显示为
-
装逼
进制转换的核心原理
一、进制的基本概念
-
基数(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
转二进制0.625 × 2 = 1.25 → 取整1,剩余0.251
2
3
4
5
6
7
8
9
1011 = 5 × 2 + 1 (余1)
5 = 2 × 2 + 1 (余1)
2 = 1 × 2 + 0 (余0)
1 = 0 × 2 + 1 (余1)
```
逆序余数得`1011`。
- **小数部分:乘基取整法**
将小数部分反复乘以目标进制基数,顺序记录整数部分。
**示例**:十进制`0.625`转二进制
0.25 × 2 = 0.5 → 取整0,剩余0.5
0.5 × 2 = 1.0 → 取整1,剩余0顺序排列得`0.101`。
3. 二进制 ↔ 八进制/十六进制
-
二进制 → 八进制
每3位二进制为一组(从右向左,不足补零),直接转换。
示例:101101
→101 101
→5 5
→55_{(8)}
。 -
二进制 → 十六进制
每4位二进制为一组(从右向左,不足补零)。
示例:1101101
→0110 1101
→6 D
→6D_{(16)}
。 -
反向转换
将每位八进制/十六进制数展开为3/4位二进制。
示例:十六进制A3
→1010 0011
→10100011
。
三、通用转换公式
所有进制转换均可通过以下公式实现:
- ( B ):目标进制基数
- ( d_k ):第( k )位的数字
- ( n, m ):整数和小数部分的位数
总结与技巧
-
快速转换口诀
- 二进制转十六进制:4位一组,查表转换。
- 十进制转二进制:除2取余,逆序排列。
-
编程实现
大多数编程语言提供内置函数(如Python的int("1011", 2)
可直接将二进制转为十进制)。 -
避免错误
- 补零对齐:分组转换时注意位数不足需补零(如二进制
101
转八进制需补零为101
→5
)。 - 小数精度:十进制小数转其他进制时可能无限循环(如0.1转二进制为无限循环
0.000110011...
)。
- 补零对齐:分组转换时注意位数不足需补零(如二进制
参考与扩展
Bryant, Randal E., and David R. O’Hallaron. Computer Systems: A Programmer’s Perspective. 3rd ed., Pearson, 2016.