Python - 位运算符

大家好,未来的Python巫师们!今天,我们将开始一段激动人心的旅程,进入位运算符的世界。我知道你们可能在想:“位运算符?那不就像是只有计算机科学家才会关心的事情吗!”但相信我,理解这些运算符可以非常有用,甚至非常有趣!那么,让我们一起来揭开位和字节的神秘面纱。

Python - Bitwise Operators

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