在学习这篇文章的时候,遇到了一个关于位运算符的概念,想要弄清楚,所以就去查了一下资料。下面是具体的内容。
一、位运算符
按位与(AND):
a = 10 # 二进制表示为 1010
b = 6 # 二进制表示为 0110
result = a & b
print(result) # 输出 2,二进制表示为 001
这里的计算是按位与运算符(&)进行的。按位与运算的规则是,对于两个操作数的每个对应位,只有当两个位上的值都为 1 时,结果的对应位才为 1。否则,结果的对应位为 0。
让我们逐位对 a 和 b 进行按位与运算来计算结果:
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。
让我们逐位对 a 和 b 进行按位或运算来计算结果:
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。
让我们逐位对 a 和 b 进行按位异或运算来计算结果:
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 (二进制)
