Python - 位运算符
大家好,未来的Python巫师们!今天,我们将开始一段激动人心的旅程,进入位运算符的世界。我知道你们可能在想:“位运算符?那不就像是只有计算机科学家才会关心的事情吗!”但相信我,理解这些运算符可以非常有用,甚至非常有趣!那么,让我们一起来揭开位和字节的神秘面纱。
Python位运算符
位运算符是作用于数字的二进制表示的特殊运算符。它们操纵单个位,位是计算中最小的数据单位。把位想象成可以是开(1)或关(0)的小开关。
在我们深入每个运算符之前,先快速看一下Python中所有的位运算符:
运算符 | 名称 | 描述 |
---|---|---|
& | AND | 如果两个位都是1,则将每个位设置为1 |
| | OR | 如果两个位中的一个位是1,则将每个位设置为1 |
^ | XOR | 如果只有两个位中的一个位是1,则将每个位设置为1 |
~ | NOT | 反转所有位 |
<< | 左移 | 通过从右侧推入0来实现左移 |
>> | 右移 | 通过从左侧推入最左侧位的副本来实现右移 |
现在,让我们详细探讨每一个运算符。
Python位与运算符 (&)
位与运算符(&)将第一个操作数的每个位与第二个操作数的相应位进行比较。如果两个位都是1,则相应的结果位设置为1。否则,相应的结果位设置为0。
来看一个例子:
a = 5 # 二进制:0101
b = 3 # 二进制:0011
result = a & b
print(f"{a} & {b} = {result}") # 输出:5 & 3 = 1
在这个例子中,我们对5(二进制0101)和3(二进制0011)执行位与操作。结果是1(二进制0001)。
这是如何工作的:
0101 (5)
& 0011 (3)
----
0001 (1)
正如你所看到的,只有最右边的位在两个数字中都是1,所以结果中只有那个位是1。
Python位或运算符 (|)
位或运算符(|)将第一个操作数的每个位与第二个操作数的相应位进行比较。如果任一位是1,则相应的结果位设置为1。否则,相应的结果位设置为0。
这里有一个例子:
a = 5 # 二进制:0101
b = 3 # 二进制:0011
result = a | b
print(f"{a} | {b} = {result}") # 输出:5 | 3 = 7
在这种情况下,我们对5和3执行位或操作。结果是7(二进制0111)。
以下是分解:
0101 (5)
| 0011 (3)
----
0111 (7)
结果在原始数字中的任一位为1的位置都有1。
Python位异或运算符 (^)
位异或(排他或)运算符(^)将第一个操作数的每个位与第二个操作数的相应位进行比较。如果位不同,则相应的结果位设置为1。如果位相同,则相应的结果位设置为0。
看一个例子:
a = 5 # 二进制:0101
b = 3 # 二进制:0011
result = a ^ b
print(f"{a} ^ {b} = {result}") # 输出:5 ^ 3 = 6
在这里,我们对5和3执行位异或操作。结果是6(二进制0110)。
这是如何工作的:
0101 (5)
^ 0011 (3)
----
0110 (6)
结果在原始数字的位不同时有1。
Python位非运算符 (~)
位非运算符(~)是一个一元运算符(它只接受一个操作数),它会翻转操作数的位。每个0变为1,每个1变为0。
这里有一个例子:
a = 5 # 二进制:0101
result = ~a
print(f"~{a} = {result}") # 输出:~5 = -6
你可能会想知道为什么结果是-6。这是因为Python使用二进制补码来表示负数。在二进制补码中,最左边的位表示符号(0为正,1为负)。
以下是幕后发生的事情:
00000101 (5)
~
11111010 (-6的二进制补码)
Python位左移运算符 (<<)
位左移运算符(<<)将第一个操作数的位向左移动由第二个操作数指定的位数。右侧的新位用0填充。
看一个例子:
a = 5 # 二进制:0101
b = 1
result = a << b
print(f"{a} << {b} = {result}") # 输出:5 << 1 = 10
在这种情况下,我们将5的位向左移动1位。结果是10(二进制1010)。
以下是发生的情况:
0101 (5)
向左移动1位
1010 (10)
每次左移都有效地将数字乘以2。
Python位右移运算符 (>>)
位右移运算符(>>)将第一个操作数的位向右移动由第二个操作数指定的位数。对于正数,左侧的新位用0填充。
这里有一个例子:
a = 5 # 二进制:0101
b = 1
result = a >> b
print(f"{a} >> {b} = {result}") # 输出:5 >> 1 = 2
在这里,我们将5的位向右移动1位。结果是2(二进制0010)。
以下是分解:
0101 (5)
向右移动1位
0010 (2)
每次右移都有效地将数字除以2(向下取整到最接近的整数)。
就是这样,各位!我们已经穿越了Python中的位运算符之地。这些运算符一开始可能看起来有点抽象,但它们是非常强大的工具,特别是当你处理低级操作或需要优化代码性能时。
记住,熟能生巧。尝试玩转这些运算符,用不同的数字进行实验,看看你会得到什么结果。在你意识到之前,你将会像专业人士一样操纵位!
编程愉快,愿位永远在你一边!
Credits: Image by storyset