位运算符 #
位运算符直接对整数的二进制位进行操作。
一、位运算符列表 #
| 运算符 | 名称 | 描述 | 示例 |
|---|---|---|---|
& |
按位与 | 两位都为1才为1 | 5 & 3 → 1 |
| |
按位或 | 有一位为1就为1 | 5 | 3 → 7 |
^ |
按位异或 | 两位不同为1 | 5 ^ 3 → 6 |
~ |
按位取反 | 0变1,1变0 | ~5 → -6 |
<< |
左移 | 各位左移n位 | 5 << 2 → 20 |
>> |
右移 | 各位右移n位 | 5 >> 2 → 1 |
二、二进制基础 #
2.1 二进制表示 #
python
# 查看整数的二进制表示
print(bin(5)) # '0b101'
print(bin(10)) # '0b1010'
print(bin(255)) # '0b11111111'
# 指定宽度的二进制
print(format(5, '08b')) # '00000101'
print(format(10, '08b')) # '00001010'
2.2 补码表示 #
Python使用补码表示负整数:
python
# 正数
# 5 的二进制:00000101
# 负数(补码)
# -5 的二进制:
# 1. 5的原码:00000101
# 2. 取反:11111010
# 3. 加1:11111011
print(bin(-5)) # '-0b101'(显示为负数形式)
print(format(-5, '08b')) # 显示实际存储方式
三、按位与 (&) #
3.1 基本规则 #
text
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
3.2 示例 #
python
a = 5 # 00000101
b = 3 # 00000011
result = a & b
# 00000101
# & 00000011
# -----------
# 00000001 = 1
print(result) # 1
3.3 应用场景 #
python
# 判断奇偶(检查最低位)
def is_odd(n):
return n & 1 == 1
print(is_odd(5)) # True
print(is_odd(4)) # False
# 获取特定位的值
def get_bit(n, pos):
return (n >> pos) & 1
print(get_bit(5, 0)) # 1(最低位)
print(get_bit(5, 1)) # 0
print(get_bit(5, 2)) # 1
# 清除特定位(置0)
def clear_bit(n, pos):
return n & ~(1 << pos)
print(clear_bit(7, 1)) # 5(清除第1位)
# 保留特定位(掩码)
mask = 0b00001111 # 保留低4位
value = 0b11011010
print(bin(value & mask)) # 0b1010
四、按位或 (|) #
4.1 基本规则 #
text
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
4.2 示例 #
python
a = 5 # 00000101
b = 3 # 00000011
result = a | b
# 00000101
# | 00000011
# -----------
# 00000111 = 7
print(result) # 7
4.3 应用场景 #
python
# 设置特定位(置1)
def set_bit(n, pos):
return n | (1 << pos)
print(set_bit(4, 0)) # 5(设置第0位)
# 合并权限
READ = 0b001 # 1
WRITE = 0b010 # 2
EXECUTE = 0b100 # 4
permission = READ | WRITE
print(permission) # 3
# 检查权限
def has_permission(perm, flag):
return (perm & flag) != 0
print(has_permission(permission, READ)) # True
print(has_permission(permission, EXECUTE)) # False
五、按位异或 (^) #
5.1 基本规则 #
text
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
5.2 示例 #
python
a = 5 # 00000101
b = 3 # 00000011
result = a ^ b
# 00000101
# ^ 00000011
# -----------
# 00000110 = 6
print(result) # 6
5.3 异或的特性 #
python
# 任何数与自身异或为0
print(5 ^ 5) # 0
# 任何数与0异或保持不变
print(5 ^ 0) # 5
# 交换律
print(5 ^ 3 == 3 ^ 5) # True
# 结合律
print((5 ^ 3) ^ 7 == 5 ^ (3 ^ 7)) # True
# 自反性
a = 5
b = 3
print(a ^ b ^ b) # 5(还原为a)
print(a ^ b ^ a) # 3(还原为b)
5.4 应用场景 #
python
# 交换两个变量(不使用临时变量)
a, b = 5, 3
a = a ^ b
b = a ^ b
a = a ^ b
print(a, b) # 3, 5
# 更好的方式(Python特有)
a, b = 5, 3
a, b = b, a
# 简单加密
def encrypt(text, key):
return ''.join(chr(ord(c) ^ key) for c in text)
def decrypt(text, key):
return encrypt(text, key) # 异或两次还原
message = "Hello"
key = 123
encrypted = encrypt(message, key)
decrypted = decrypt(encrypted, key)
print(decrypted) # "Hello"
# 找出数组中只出现一次的数
def find_single(nums):
result = 0
for num in nums:
result ^= num
return result
print(find_single([1, 2, 3, 2, 1])) # 3
# 翻转特定位
def toggle_bit(n, pos):
return n ^ (1 << pos)
print(toggle_bit(5, 1)) # 7(翻转第1位)
六、按位取反 (~) #
6.1 基本规则 #
text
~1 = 0
~0 = 1
6.2 示例 #
python
a = 5 # 00000101
result = ~a
# ~00000101
# -----------
# 11111010 = -6(补码表示)
print(result) # -6
6.3 理解取反 #
python
# ~x = -(x + 1)
print(~5) # -6
print(~(-5)) # 4
# 证明
print(~5 == -(5 + 1)) # True
print(~(-5) == -(-5 + 1)) # True
6.4 应用场景 #
python
# 获取掩码
mask = ~0 # -1,所有位都是1
print(bin(mask & 0xFF)) # '0b11111111'
# 清除最低位的1
def clear_lowest_bit(n):
return n & (n - 1)
# 另一种方式
def clear_lowest_bit_v2(n):
return n & ~n
# 注意:n & ~n 总是 0
print(5 & ~5) # 0
七、左移 (<<) #
7.1 基本规则 #
左移n位相当于乘以2^n:
python
a = 5 # 00000101
result = a << 2
# 00000101 左移2位
# -----------
# 00010100 = 20
print(result) # 20
print(5 * 4) # 20(5 * 2^2)
7.2 示例 #
python
# 左移相当于乘以2的幂
print(5 << 1) # 10 (5 * 2)
print(5 << 2) # 20 (5 * 4)
print(5 << 3) # 40 (5 * 8)
# 负数左移
print(-5 << 2) # -20
7.3 应用场景 #
python
# 快速乘以2
n = 10
n = n << 1 # 20
# 创建掩码
mask = 1 << 5 # 32,第5位为1
print(bin(mask)) # '0b100000'
# 计算颜色值
def rgb(r, g, b):
return (r << 16) | (g << 8) | b
color = rgb(255, 128, 64)
print(hex(color)) # '0xff8040'
八、右移 (>>) #
8.1 基本规则 #
右移n位相当于除以2^n(向下取整):
python
a = 20 # 00010100
result = a >> 2
# 00010100 右移2位
# -----------
# 00000101 = 5
print(result) # 5
print(20 // 4) # 5(20 // 2^2)
8.2 示例 #
python
# 右移相当于除以2的幂(向下取整)
print(20 >> 1) # 10 (20 // 2)
print(20 >> 2) # 5 (20 // 4)
print(20 >> 3) # 2 (20 // 8)
# 负数右移(算术右移,保持符号位)
print(-20 >> 2) # -5
8.3 算术右移 vs 逻辑右移 #
python
# Python使用算术右移(保持符号位)
# 正数右移,高位补0
print(20 >> 2) # 5
# 负数右移,高位补1
print(-20 >> 2) # -5
print(-1 >> 10) # -1(全是1)
8.4 应用场景 #
python
# 快速除以2
n = 20
n = n >> 1 # 10
# 取颜色分量
def get_rgb(color):
r = (color >> 16) & 0xFF
g = (color >> 8) & 0xFF
b = color & 0xFF
return r, g, b
print(get_rgb(0xFF8040)) # (255, 128, 64)
# 取整(向下取整)
n = 17
print(n >> 1) # 8(等同于 n // 2)
九、位运算复合赋值 #
python
x = 5
x &= 3 # x = x & 3
print(x) # 1
x |= 2 # x = x | 2
print(x) # 3
x ^= 1 # x = x ^ 1
print(x) # 2
x <<= 2 # x = x << 2
print(x) # 8
x >>= 1 # x = x >> 1
print(x) # 4
十、位运算技巧 #
10.1 判断奇偶 #
python
def is_odd(n):
return n & 1 == 1
def is_even(n):
return n & 1 == 0
10.2 交换两数 #
python
a, b = 5, 3
a ^= b
b ^= a
a ^= b
print(a, b) # 3, 5
10.3 取绝对值 #
python
def abs_bit(n):
mask = n >> 31 # 获取符号位
return (n + mask) ^ mask
print(abs_bit(-5)) # 5
print(abs_bit(5)) # 5
10.4 统计1的个数 #
python
def count_bits(n):
count = 0
while n:
count += n & 1
n >>= 1
return count
print(count_bits(7)) # 3
print(count_bits(255)) # 8
# 更高效的方法
def count_bits_fast(n):
count = 0
while n:
n &= n - 1 # 清除最低位的1
count += 1
return count
10.5 判断是否为2的幂 #
python
def is_power_of_two(n):
return n > 0 and (n & (n - 1)) == 0
print(is_power_of_two(8)) # True
print(is_power_of_two(7)) # False
print(is_power_of_two(16)) # True
10.6 获取最低位的1 #
python
def get_lowest_bit(n):
return n & (-n)
print(get_lowest_bit(12)) # 4(12 = 1100,最低位1在位置2)
十一、总结 #
| 运算符 | 名称 | 规则 |
|---|---|---|
& |
按位与 | 两位都为1才为1 |
| |
按位或 | 有一位为1就为1 |
^ |
按位异或 | 两位不同为1 |
~ |
按位取反 | 0变1,1变0,结果为 -(x+1) |
<< |
左移 | 各位左移,相当于乘以2^n |
>> |
右移 | 各位右移,相当于除以2^n |
常用技巧:
n & 1:判断奇偶n & (n-1):清除最低位的1n & (-n):获取最低位的1n ^ n:结果为0n ^ 0:结果为n
最后更新:2026-03-16