Appearance
进制相关
1. Python与二进制直接相关的内置函数
1.1 bin() 函数
python
# bin() 将一个整数转换为二进制字符串,前缀是 '0b'
print(bin(10)) # 输出: 0b10101.2 int() 函数
python
# int() 这是一个多功能函数,当给它传递第二个参数 2 时,可以将二进制字符串转为整数
print(int('1010', 2)) # 输出: 101.3 oct() 和 hex() 函数
python
# oct() 和 hex(): 这两个函数分别将整数转为八进制和十六进制字符串,前缀分别是 '0o' 和 '0x'
print(oct(10)) # 输出: 0o12
print(hex(10)) # 输出: 0xa1.4 format() 函数
python
# format(): 这是一个非常强大的格式化函数,可以用它来格式化输出不同进制的数字,且不带前缀
print(format(10, 'b')) # 输出: 1010 (二进制)
print(format(10, 'o')) # 输出: 12 (八进制)
print(format(10, 'x')) # 输出: a (十六进制,小写)
print(format(10, 'X')) # 输出: A (十六进制,大写)2. 二进制移位操作
2.1 左移 (<<)
- 功能: 把二进制数的所有位向左移动,右边空出的位用 0 填充
- 数学意义: 相当于乘以 2 的 n 次方(n 是移动的位数)
python
# 例如:10 << 1,十进制 10 是1010,左移 1 位后是10100,即十进制 20
print(10 << 1) # 输出: 202.2 右移 (>>)
- 功能: 把二进制数的所有位向右移动,左边空出的位用符号位填充(正数补 0,负数补 1)
- 数学意义: 相当于除以 2 的 n 次方,向下取整
python
# 例如:10 >> 1,十进制 10 是1010,右移 1 位后是101,即十进制 5
print(10 >> 1) # 输出: 5注意: Python 的整数理论上可以无限大,所以不会出现其他语言中的 "溢出" 问题。
3. 二进制的乘法实现
3.1 原理
我们用 10 * 12 这个例子来看看如何用移位和加法来实现乘法。
核心思想:
- 把乘法转换成加法和移位,利用的是 a * b 可以拆成多个 a 的倍数相加
- 关键:任何整数都可以用 2 的幂次方的和来表示
- 12 可以写成 8 + 4,也就是 2^3 + 2^2
- 所以 10 * 12 就等于 10 * (8 + 4),即 (10 * 8) + (10 * 4)
3.2 二进制世界中的对应关系
在二进制世界里:
- 10 * 4 等价于 10 左移 2 位
- 10 * 8 等价于 10 左移 3 位
3.3 计算过程
步骤 1: 分解乘数
- 12 的二进制是 1100
- 从右数第 3 位和第 4 位是 1
- 这对应了 2^2 和 2^3,即 4 和 8
步骤 2: 移位操作
python
# 10 左移 2 位:10 << 2 = 101000 (十进制 40)
print(10<<2) # 40
# 10 左移 3 位:10 << 3 = 1010000 (十进制 80)
print(10<<3) # 80步骤 3: 相加结果
python
# 40 + 80 = 120
print(40 + 80) # 输出: 1203.4 总结
这样,我们就用移位和加法完成了 10 * 12 = 120 的计算。这种方法在底层硬件中非常高效,因为移位和加法是 CPU 最擅长的操作。
4. 二进制小数转换成十进制小数
4.1 转换原理
小数部分每一位乘以 2 的负幂次方,然后相加。
4.2 实例演示:1101.011
我们用例子 1101.011 来演示完整的转换过程。
步骤 1: 拆分数字
把数字分成整数部分和小数部分:
- 整数部分: 1101
- 小数部分: 011
步骤 2: 计算整数部分
从右往左,从 0 开始计数:
| 位置 | 位值 | 计算 | 结果 |
|---|---|---|---|
| 3 | 1 | 1 × 2³ | 8 |
| 2 | 1 | 1 × 2² | 4 |
| 1 | 0 | 0 × 2¹ | 0 |
| 0 | 1 | 1 × 2⁰ | 1 |
整数部分总和: 8 + 4 + 0 + 1 = 13
步骤 3: 计算小数部分
从小数点后第一位开始,从左往右,从 -1 开始计数:
| 位置 | 位值 | 计算 | 结果 |
|---|---|---|---|
| -1 | 0 | 0 × 2⁻¹ | 0 |
| -2 | 1 | 1 × 2⁻² | 0.25 |
| -3 | 1 | 1 × 2⁻³ | 0.125 |
小数部分总和: 0 + 0.25 + 0.125 = 0.375
步骤 4: 合并结果
python
# 最终结果
整数部分 + 小数部分 = 13 + 0.375 = 13.3754.3 总结
所以,二进制的 1101.011 就等于十进制的 13.375。
记忆要点:
- 整数部分:从右往左,位置从 0 开始
- 小数部分:从左往右,位置从 -1 开始
- 每一位的值 = 位值 × 2^位置
