Skip to content

进制相关

1. Python与二进制直接相关的内置函数

1.1 bin() 函数

python
# bin() 将一个整数转换为二进制字符串,前缀是 '0b'
print(bin(10))  # 输出: 0b1010

1.2 int() 函数

python
# int() 这是一个多功能函数,当给它传递第二个参数 2 时,可以将二进制字符串转为整数
print(int('1010', 2))  # 输出: 10

1.3 oct() 和 hex() 函数

python
# oct() 和 hex(): 这两个函数分别将整数转为八进制和十六进制字符串,前缀分别是 '0o' 和 '0x'
print(oct(10))  # 输出: 0o12
print(hex(10))  # 输出: 0xa

1.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)  # 输出: 20

2.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)  # 输出: 120

3.4 总结

这样,我们就用移位和加法完成了 10 * 12 = 120 的计算。这种方法在底层硬件中非常高效,因为移位和加法是 CPU 最擅长的操作。

4. 二进制小数转换成十进制小数

4.1 转换原理

小数部分每一位乘以 2 的负幂次方,然后相加。

4.2 实例演示:1101.011

我们用例子 1101.011 来演示完整的转换过程。

步骤 1: 拆分数字

把数字分成整数部分和小数部分:

  • 整数部分: 1101
  • 小数部分: 011

步骤 2: 计算整数部分

从右往左,从 0 开始计数:

位置位值计算结果
311 × 2³8
211 × 2²4
100 × 2¹0
011 × 2⁰1

整数部分总和: 8 + 4 + 0 + 1 = 13

步骤 3: 计算小数部分

从小数点后第一位开始,从左往右,从 -1 开始计数:

位置位值计算结果
-100 × 2⁻¹0
-211 × 2⁻²0.25
-311 × 2⁻³0.125

小数部分总和: 0 + 0.25 + 0.125 = 0.375

步骤 4: 合并结果

python
# 最终结果
整数部分 + 小数部分 = 13 + 0.375 = 13.375

4.3 总结

所以,二进制的 1101.011 就等于十进制的 13.375

记忆要点:

  • 整数部分:从右往左,位置从 0 开始
  • 小数部分:从左往右,位置从 -1 开始
  • 每一位的值 = 位值 × 2^位置

基于 VitePress 构建的 AP CSP 学习平台