pin_drop当前位置:知识文库 ❯ 图文
Python位运算符
目录
概述
位运算符直接对整数的二进制位进行操作,是底层编程和性能优化的重要工具。虽然日常开发中使用频率不如算术和逻辑运算符,但在加密算法、网络协议、图像处理、嵌入式开发等领域有着不可替代的作用。本节将详细介绍Python中的六种位运算符及其应用场景。
二进制表示
在学习位运算之前,需要先理解二进制表示。Python中可以使用bin()函数查看整数的二进制形式:
代码示例
print(bin(10))
print(bin(255))
print(bin(-10))输出:
代码示例
0b1010
0b11111111
-0b1010进制表示
补码表示
Python中负数使用补码表示。以8位为例:
-
正数
5:0000 0101 -
负数
-5:1111 1011(补码)
Python的整数没有固定位数限制,负数的二进制表示以-开头:
代码示例
print(bin(5))
print(bin(-5))按位与(&)
按位与运算符对两个数的每一位进行与运算,只有两个对应位都为1时结果才为1。
运算规则
示例
代码示例
a = 12
b = 10
print(f"a = {a} ({bin(a)})")
print(f"b = {b} ({bin(b)})")
print(f"a & b = {a & b} ({bin(a & b)})")输出:
代码示例
a = 12 (0b1100)
b = 10 (0b1010)
a & b = 8 (0b1000)计算过程:
代码示例
1100 (12)
& 1010 (10)
------
1000 (8)应用:清零和取特定位
代码示例
num = 0b11010110
mask = 0b00001111
lower_4 = num & mask
print(f"低4位: {bin(lower_4)}")
upper_4_mask = 0b11110000
upper_4 = num & upper_4_mask
print(f"高4位(保留): {bin(upper_4)}")按位或(|)
按位或运算符对两个数的每一位进行或运算,只要有一个对应位为1结果就为1。
运算规则
示例
代码示例
a = 12
b = 10
print(f"a | b = {a | b} ({bin(a | b)})")输出:
代码示例
a | b = 14 (0b1110)计算过程:
代码示例
1100 (12)
| 1010 (10)
------
1110 (14)应用:设置标志位
代码示例
READ = 0b0001
WRITE = 0b0010
EXECUTE = 0b0100
permission = READ | WRITE
print(f"读写权限: {bin(permission)}")
permission = permission | EXECUTE
print(f"添加执行权限: {bin(permission)}")按位异或(^)
按位异或运算符对两个数的每一位进行异或运算,对应位不同时结果为1,相同时为0。
运算规则
示例
代码示例
a = 12
b = 10
print(f"a ^ b = {a ^ b} ({bin(a ^ b)})")输出:
代码示例
a ^ b = 6 (0b0110)计算过程:
代码示例
1100 (12)
^ 1010 (10)
------
0110 (6)应用:交换变量
代码示例
a = 15
b = 27
print(f"交换前: a={a}, b={b}")
a = a ^ b
b = a ^ b
a = a ^ b
print(f"交换后: a={a}, b={b}")应用:简单加密
代码示例
key = 123
message = 72
encrypted = message ^ key
print(f"加密后: {encrypted}")
decrypted = encrypted ^ key
print(f"解密后: {decrypted}")按位取反(~)
按位取反运算符对操作数的每一位取反,0变1,1变0。
运算规则
示例
代码示例
a = 10
print(f"~{a} = {~a}")
print(f"~0 = {~0}")
print(f"~-1 = {~-1}")输出:
代码示例
~10 = -11
~0 = -1
~-1 = 0取反公式
~x = -(x + 1)
代码示例
for x in [0, 1, 5, 10, 255]:
print(f"~{x} = {~x}, -({x}+1) = {-(x + 1)}")左移(<<)
左移运算符将二进制位向左移动指定位数,右侧补0。每左移一位相当于乘以2。
示例
代码示例
a = 5
print(f"{a} << 1 = {a << 1}")
print(f"{a} << 2 = {a << 2}")
print(f"{a} << 3 = {a << 3}")输出:
代码示例
5 << 1 = 10
5 << 2 = 20
5 << 3 = 40计算过程:
代码示例
5 = 0000 0101
5 << 1 = 0000 1010 (10)
5 << 2 = 0001 0100 (20)
5 << 3 = 0010 1000 (40)应用:快速乘以2的幂
代码示例
num = 7
print(f"{num} * 2 = {num << 1}")
print(f"{num} * 4 = {num << 2}")
print(f"{num} * 8 = {num << 3}")
print(f"{num} * 16 = {num << 4}")右移(>>)
右移运算符将二进制位向右移动指定位数,左侧补符号位。每右移一位相当于除以2(向下取整)。
示例
代码示例
a = 40
print(f"{a} >> 1 = {a >> 1}")
print(f"{a} >> 2 = {a >> 2}")
print(f"{a} >> 3 = {a >> 3}")输出:
代码示例
40 >> 1 = 20
40 >> 2 = 10
40 >> 3 = 5计算过程:
代码示例
40 = 0010 1000
40 >> 1 = 0001 0100 (20)
40 >> 2 = 0000 1010 (10)
40 >> 3 = 0000 0101 (5)负数右移
代码示例
a = -40
print(f"{a} >> 1 = {a >> 1}")
print(f"{a} >> 2 = {a >> 2}")输出:
代码示例
-40 >> 1 = -20
-40 >> 2 = -10应用:快速除以2的幂
代码示例
num = 100
print(f"{num} // 2 = {num >> 1}")
print(f"{num} // 4 = {num >> 2}")
print(f"{num} // 8 = {num >> 3}")运算符表格
代码示例
示例1:权限管理
代码示例
PERMISSION_READ = 1
PERMISSION_WRITE = 2
PERMISSION_EXECUTE = 4
PERMISSION_ADMIN = 8
user_permission = PERMISSION_READ | PERMISSION_WRITE
if user_permission & PERMISSION_READ:
print("有读权限")
if user_permission & PERMISSION_WRITE:
print("有写权限")
if user_permission & PERMISSION_EXECUTE:
print("有执行权限")
else:
print("无执行权限")示例2:判断奇偶
代码示例
def is_even(n):
return (n & 1) == 0
for i in range(6):
print(f"{i}: {'偶数' if is_even(i) else '奇数'}")示例3:颜色操作
代码示例
red = 0xFF0000
green = 0x00FF00
blue = 0x0000FF
yellow = red | green
print(f"黄色: #{yellow:06X}")
r = (yellow & 0xFF0000) >> 16
g = (yellow & 0x00FF00) >> 8
b = yellow & 0x0000FF
print(f"RGB: ({r}, {g}, {b})")示例4:位运算实现加减
代码示例
def add(a, b):
while b != 0:
carry = a & b
a = a ^ b
b = carry << 1
return a
print(f"3 + 5 = {add(3, 5)}")
print(f"15 + 27 = {add(15, 27)}")注意事项
注意:位运算只适用于整数。对浮点数使用位运算会抛出
TypeError。
提示:Python整数无溢出。Python整数没有固定位数限制,左移不会溢出,但负数右移需要注意。
提示:取反公式
~x = -(x + 1),理解这个公式有助于快速计算取反结果。
提示:位移效率——位运算比乘除法更快,但现代编译器通常会自动优化,不必过度追求位运算。
提示:可读性优先——在大多数场景下,使用算术运算符比位运算符更易读,除非有明确的性能需求或位操作语义。
小结
本节我们学习了:
-
按位与(&):两位都为1则为1,常用于清零和取特定位
-
按位或(|):有一位为1则为1,常用于设置标志位
-
按位异或(^):两位不同则为1,常用于交换变量和加密
-
按位取反(~):各位取反,
~x = -(x + 1) -
左移(<<):左移n位相当于乘以2的n次方
-
右移(>>):右移n位相当于除以2的n次方
位运算符虽然使用频率不如算术运算符,但在特定场景下非常高效和实用,是Python程序员应该掌握的重要工具。
练习题
练习1
编写程序,输入一个整数,使用位运算判断它是否是2的幂次方。(提示:2的幂次方的二进制表示中只有一个1)
练习2
编写程序,输入一个整数,统计其二进制表示中1的个数。例如,13的二进制为1101,有3个1。
常见问题
Python中位运算符可以用于浮点数吗?
不可以。位运算符只适用于整数类型,对浮点数使用位运算会抛出TypeError异常。
为什么~10的结果是-11?
这是由取反公式决定的:~x = -(x + 1)。所以~10 = -(10 + 1) = -11。
位运算真的比乘除法快吗?
在底层硬件级别,位运算确实比乘除法更快。但现代编译器和Python解释器通常会自动优化乘除2的幂次的运算,因此在大多数场景下差异不明显。除非有明确的性能需求,否则应优先使用可读性更好的算术运算符。
如何用位运算判断一个数是否是2的幂次方?
如果一个数n是2的幂次方,那么它的二进制表示中只有一个1。利用这个特性,可以用n & (n-1) == 0来判断。例如8的二进制是1000,7的二进制是0111,8&7=0,说明8是2的幂次方。
Python的左移会导致溢出吗?
不会。Python的整数没有固定位数限制,可以自动扩展到任意大小,所以左移操作不会导致溢出。这与C/Java等固定位数整数的语言不同。
本文涉及AI创作
内容由AI创作,请仔细甄别