一文吃透 Python 位运算:从底层逻辑到实战应用
位运算是 Python 中贴近计算机底层的运算方式,它直接对二进制位(0 和 1)进行操作,执行效率远高于普通的算术运算。很多新手觉得位运算抽象难理解,但只要掌握二进制的核心逻辑,再结合实际例子,就能轻松掌握。本文将系统讲解 Python 中 6 种核心位运算(左移、右移、按位与、按位或、按位异或、按位取反),从原理到示例,再到实战场景,全方位拆解。
一、前置知识:二进制与位运算基础
在学习位运算前,必须先明确两个核心概念:
- 二进制:计算机存储数据的最小单位是位(bit),8 位组成 1 字节(Byte)。我们日常使用的十进制数,计算机都会转换为二进制处理(如十进制 5 → 二进制
0101)。 - 位运算规则:所有位运算均基于二进制位的逐位操作,运算对象需先转换为二进制,再按规则计算,最终可转回十进制。
为方便讲解,本文示例统一使用8 位二进制(不足 8 位时高位补 0),且默认处理整数(Python 支持任意长度二进制,但 8 位更易理解)。
二、6 种核心位运算详解(附大量示例)
1. 按位左移 <<
原理
将数字的二进制位全部向左移动指定位数,右侧空出的位补 0,高位溢出则舍弃。
数学等价关系:x << n ≈ x * (2^n)(无溢出时完全等价)。
示例(十进制→二进制→运算→转回十进制)
# 示例1:5 << 1(5的二进制:0000 0101)
print(5 << 1) # 输出10
# 运算过程:0000 0101 左移1位 → 0000 1010(十进制10)
# 示例2:5 << 2
print(5 << 2) # 输出20
# 运算过程:0000 0101 左移2位 → 0001 0100(十进制20)
# 示例3:溢出场景(8位限制下)
# 128的8位二进制:1000 0000,左移1位后高位1溢出,结果为0
print(128 << 1) # 无8位限制时Python输出256,若限定8位则为0
应用场景
- 快速计算乘以 2 的 n 次方(比
*运算更快); - 数据压缩、位图处理中扩展位宽。
2. 按位右移 >>
原理
将数字的二进制位全部向右移动指定位数,左侧空出的位:
- 正数:补 0;
- 负数:补 1(Python 中负数以补码形式存储)。数学等价关系:
x >> n≈x // (2^n)(向下取整)。
示例
# 示例1:正数右移(10 >> 1,10的二进制:0000 1010)
print(10 >> 1) # 输出5
# 运算过程:0000 1010 右移1位 → 0000 0101(十进制5)
# 示例2:正数右移(10 >> 2)
print(10 >> 2) # 输出2
# 运算过程:0000 1010 右移2位 → 0000 0010(十进制2)
# 示例3:负数右移(-10 >> 1,-10的8位补码:1111 0110)
print(-10 >> 1) # 输出-5
# 运算过程:1111 0110 右移1位 → 1111 1011(十进制-5)
应用场景
- 快速计算除以 2 的 n 次方(向下取整,比
//更快); - 提取数字的高位部分。
3. 按位与 &
原理
两个数字的二进制位逐位比较,只有对应位都为 1时,结果位才为 1,否则为 0。核心口诀:同 1 则 1,有 0 则 0。
示例
# 示例1:5 & 3(5:0000 0101;3:0000 0011)
print(5 & 3) # 输出1
# 逐位运算:
# 0000 0101
# &0000 0011
# -----------
# 0000 0001(十进制1)
# 示例2:6 & 4(6:0000 0110;4:0000 0100)
print(6 & 4) # 输出4
# 逐位运算:
# 0000 0110
# &0000 0100
# -----------
# 0000 0100(十进制4)
# 示例3:判断奇偶(最经典应用)
# 原理:奇数的二进制最后一位是1,偶数是0;1的二进制是0000 0001
print(7 & 1) # 1 → 奇数
print(8 & 1) # 0 → 偶数
应用场景
- 判断数字奇偶(
x & 1,结果 1 为奇,0 为偶); - 提取二进制指定位(如保留最后 3 位:
x & 0b111); - 权限控制(如判断用户是否有某权限)。
4. 按位或 |
原理
两个数字的二进制位逐位比较,只要对应位有一个为 1,结果位就为 1,否则为 0。核心口诀:有 1 则 1,同 0 则 0。
示例
# 示例1:5 | 3(5:0000 0101;3:0000 0011)
print(5 | 3) # 输出7
# 逐位运算:
# 0000 0101
# |0000 0011
# -----------
# 0000 0111(十进制7)
# 示例2:6 | 4(6:0000 0110;4:0000 0100)
print(6 | 4) # 输出6
# 逐位运算:
# 0000 0110
# |0000 0100
# -----------
# 0000 0110(十进制6)
# 示例3:权限叠加(如用户同时拥有读和写权限)
READ = 1 # 0001
WRITE = 2 # 0010
user_perm = READ | WRITE
print(user_perm) # 3(0011)→ 同时拥有读+写权限
应用场景
- 权限叠加(如给用户添加多个权限);
- 置位操作(将二进制指定位置为 1)。
5. 按位异或 ^
原理
两个数字的二进制位逐位比较,对应位不同则为 1,相同则为 0。核心口诀:异则 1,同则 0。特殊性质:
x ^ x = 0(相同数字异或为 0);x ^ 0 = x(任何数异或 0 等于自身);a ^ b ^ b = a(异或两次同一数,恢复原值)。
示例
# 示例1:5 ^ 3(5:0000 0101;3:0000 0011)
print(5 ^ 3) # 输出6
# 逐位运算:
# 0000 0101
# ^0000 0011
# -----------
# 0000 0110(十进制6)
# 示例2:利用异或交换两个数(无需临时变量)
a = 5
b = 8
a = a ^ b # a = 5^8 = 13(0000 1101)
b = a ^ b # b = 13^8 = 5(恢复a的原值)
a = a ^ b # a = 13^5 = 8(恢复b的原值)
print(a, b) # 输出8 5
# 示例3:找数组中唯一出现一次的数(经典面试题)
# 原理:相同数异或为0,0异或唯一数等于自身
nums = [2, 3, 2, 4, 4]
res = 0
for num in nums:
res ^= num
print(res) # 输出3(唯一出现一次的数)
应用场景
- 交换两个数(无需临时变量);
- 找数组中唯一出现的数;
- 数据加密 / 解密(异或加密,加密解密用同一密钥)。
6. 按位取反 ~
原理
对数字的二进制位逐位取反(0 变 1,1 变 0),是单目运算符(仅需一个操作数)。⚠️ 关键注意:Python 中整数以补码存储,且没有位数限制,因此取反结果需结合补码规则理解:数学等价关系:~x = -(x + 1)。
示例
# 示例1:~5(5的二进制:...0000 0101)
print(~5) # 输出-6
# 运算过程:
# 原码:0000 0101 → 取反:1111 1010(补码)
# 补码转原码:1111 1010 → 减1:1111 1001 → 取反:0000 0110 → 加负号:-6
# 示例2:~0
print(~0) # 输出-1
# 原理:~0 = -(0+1) = -1
# 示例3:~-3
print(~-3) # 输出2
# 原理:~-3 = -(-3 + 1) = 2
应用场景
- 快速计算负数(
~x + 1 = -x); - 位掩码反转(如将某几位的 0 变 1、1 变 0)。
三、位运算核心总结
| 运算符 | 名称 | 核心规则 | 典型应用 | |
|---|---|---|---|---|
<< |
按位左移 | 左移 n 位 = 乘以 2^n | 快速乘 2、扩展位宽 | |
>> |
按位右移 | 右移 n 位 = 除以 2^n(向下取整) | 快速除 2、提取高位 | |
& |
按位与 | 同 1 则 1,有 0 则 0 | 判断奇偶、提取指定位 | |
| ` | ` | 按位或 | 有 1 则 1,同 0 则 0 | 权限叠加、置位操作 |
^ |
按位异或 | 异则 1,同则 0 | 交换数、找唯一数、加密 | |
~ |
按位取反 | 0 变 1,1 变 0(~x=-(x+1)) | 快速求负、位掩码反转 |
四、位运算的优势与实战建议
- 效率优势:位运算直接操作二进制位,无需进制转换,比算术运算(
+、*、/)更快,适合高性能场景(如游戏开发、数据处理); - 代码简洁:异或交换数、找唯一数等场景,位运算能大幅简化代码;
- 新手注意:
- 优先理解二进制转换规则,再记运算口诀;
- 负数位运算需结合补码理解,先掌握正数运算再扩展;
- 实际开发中,除非追求极致性能,否则优先用易读的算术运算(如
x*2比x<<1更易理解)。
位运算看似抽象,但只要结合二进制原理和实际示例反复练习,就能从 “看不懂” 到 “熟练用”。掌握位运算,不仅能提升代码效率,还能理解计算机底层数据处理逻辑,对深入学习编程至关重要。
更多推荐



所有评论(0)