在学习这篇文章的时候,遇到了一个关于位运算符的概念,想要弄清楚,所以就去查了一下资料。下面是具体的内容。

一、位运算符

按位与(AND):

a = 10  # 二进制表示为 1010
b = 6   # 二进制表示为 0110
result = a & b
print(result)  # 输出 2,二进制表示为 001

这里的计算是按位与运算符(&)进行的。按位与运算的规则是,对于两个操作数的每个对应位,只有当两个位上的值都为 1 时,结果的对应位才为 1。否则,结果的对应位为 0。

让我们逐位对 ab 进行按位与运算来计算结果:

   a:  1  0  1  0    (二进制)
   b:  0  1  1  0    (二进制)
------------------
result:  0  0  1  0    (二进制)

通过对每个对应位进行按位与运算,得到结果 0010,它的十进制表示为 2。

因此,result 的值是 2,二进制表示为 0010


按位或(OR):

a = 10  # 二进制表示为 1010
b = 6   # 二进制表示为 0110
result = a | b
print(result)  # 输出 14,二进制表示为 1110

这里的计算是按位或运算符(|)进行的。按位或运算的规则是,对于两个操作数的每个对应位,只要有一个位上的值为 1,结果的对应位就为 1。否则,结果的对应位为 0。

让我们逐位对 ab 进行按位或运算来计算结果:

   a:  1  0  1  0    (二进制)
   b:  0  1  1  0    (二进制)
------------------
result:  1  1  1  0    (二进制)

通过对每个对应位进行按位或运算,得到结果 1110,它的十进制表示为 14。

因此,result 的值是 14,二进制表示为 1110


按位异或(XOR):

a = 10  # 二进制表示为 1010
b = 6   # 二进制表示为 0110
result = a ^ b
print(result)  # 输出 12,二进制表示为 1100

这里的计算是按位异或运算符(^)进行的。按位异或运算的规则是,对于两个操作数的每个对应位,只有当两个位上的值不相同时,结果的对应位才为 1。如果两个位上的值相同,则结果的对应位为 0。

让我们逐位对 ab 进行按位异或运算来计算结果:

   a:  1  0  1  0    (二进制)
   b:  0  1  1  0    (二进制)
------------------
result:  1  1  0  0    (二进制)

通过对每个对应位进行按位异或运算,得到结果 1100,它的十进制表示为 12。

因此,result 的值是 12,二进制表示为 1100


按位取反(NOT):

a = 10  # 二进制表示为 1010
result = ~a
print(result)  # 输出 -11,二进制表示为 -1011(根据二进制补码表示)

按位取反运算符(~)是一元运算符,用于对操作数的每个位执行逻辑非操作,即将每个位上的 0 改为 1,将每个位上的 1 改为 0。

在上述示例中,a 的二进制表示是 1010。应用按位取反运算符后,对每个位执行逻辑非操作:

   a:  1  0  1  0    (二进制)
------------------
result:  0  1  0  1    (二进制)

结果得到 0101,但需要注意的是,这个结果并不是直接的二进制表示。在大多数计算机中,负数使用二进制补码表示。所以,在这个例子中,我们得到的是补码 0101,它的补码形式就是 -1011。因此,result 的值是 -11,二进制补码表示为 -1011

按位取反运算符可以用于反转整数的所有位,包括符号位。但结果的解释取决于具体的编程语言和系统。在大多数情况下,结果会以补码形式表示。


二、移位运算符

左移运算符(<<):

a = 10  # 二进制表示为 1010
result = a << 2
print(result)  # 输出 40,二进制表示为 101000

左移运算符(<<)将二进制数的各个位向左移动指定的位数,并在右侧用零填充空位。左移运算的结果相当于将原数乘以 2 的移位次数。

在上述示例中,我们有一个变量 a,它的二进制表示是 1010。我们将使用左移运算符将 a 左移 2 位。

我们可以按位对 a 进行左移操作,并在右侧用零填充空位:

   a:  1  0  1  0    (二进制)
------------------
result:  1  0  1  0  0  0    (二进制)

通过左移操作,我们得到了 101000。这个结果的十进制表示为 40

因此,将变量 a 左移 2 位后,我们得到了结果 40,二进制表示为 101000

左移运算符可以将二进制数向左移动,并在右侧用零填充空位,相当于将原数乘以 2 的移位次数。


右移运算符(>>):

a = 10  # 二进制表示为 1010
result = a >> 2
print(result)  # 输出 2,二进制表示为 10

右移运算符(>>)将二进制数的各个位向右移动指定的位数。对于有符号数,使用算术右移,即保留符号位。对于无符号数,使用逻辑右移,即在左侧用零填充空位。右移运算的结果相当于将原数除以 2 的移位次数。

在上述示例中,我们有一个变量 a,它的二进制表示是 1010。我们将使用右移运算符将 a 右移 2 位。

我们可以按位对 a 进行右移操作:

   a:  1  0  1  0    (二进制)
------------------
result:  1  0    (二进制)

通过右移操作,我们得到了 10。这个结果的十进制表示为 2

因此,将变量 a 右移 2 位后,我们得到了结果 2,二进制表示为 10

右移运算符可以将二进制数向右移动,对于有符号数会保留符号位,对于无符号数会在左侧用零填充空位,相当于将原数除以 2 的移位次数。

当对一个二进制数进行右移操作时,最右边的位将被丢弃并且被移出。右移操作会将所有位向右移动指定的位数,并在左侧用零填充空位。

   a:  1  1  1  0  1  0    (二进制)
------------------
result:  1  1  1  0    (二进制)

1
2