位运算符 #

位运算符直接对整数的二进制位进行操作。

一、位运算符列表 #

运算符 名称 描述 示例
& 按位与 两位都为1才为1 5 & 31
| 按位或 有一位为1就为1 5 | 37
^ 按位异或 两位不同为1 5 ^ 36
~ 按位取反 0变1,1变0 ~5-6
<< 左移 各位左移n位 5 << 220
>> 右移 各位右移n位 5 >> 21

二、二进制基础 #

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):清除最低位的1
  • n & (-n):获取最低位的1
  • n ^ n:结果为0
  • n ^ 0:结果为n
最后更新:2026-03-16