位运算符
位运算符用于按二进制位进行逻辑运算,操作数必须为整数。下面介绍位运算符的功能,并以a=2,b=3为例进行演示,具体如表1所示。
表1 位运算符
运算符 | 功能说明 | 示例 |
---|---|---|
<< | 按位左移 | a<<b,结果为16 |
>> | 按位右移 | a>>b,结果为0 |
& | 按位与运算 | a&b,结果为2 |
| | 按位或运算 | a|b,结果为3 |
^ | 按位异或运算 | a^b,结果为1 |
~ | 按位取反 | ~a,结果为-3 |
下面逐一介绍表1中罗列的位运算符。
1. 按位左移运算符(<<)
按位左移是指将二进制形式操作数的所有位全部左移n位,高位丢弃,低位补0。以十进制9为例,9转换为二进制后是00001001,将转换后的二进制数左移4位,其过程和结果如图1所示。
图1 按位左移
从图1中可以看出,二进制数00001001左移4位的结果为10010000。接下来,通过代码实现将9左移4位,示例如下:
a = 9
print(bin(a<<4))
运行代码,结果如下所示:
0b10010000
左移n位相当于操作数乘以2的n次方,根据此原理可借助乘法运算符实现左移功能,例如,10左移3位,利用乘法运算符进行计算即为10×23。
2. 按位右移运算符(>>)
按位右移是指将二进制形式操作数的所有位全部右移n位,低位丢弃,高位补0。以十进制8为例,8转换为二进制后是00001000,将转换后的二进制数右移2位,其过程和结果如图2所示。
图2 按位右移
从图2中可以看出,二进制数00001000右移2位的结果为00000010。接下来,通过代码实现将8右移2位,示例如下:
a = 8
print(bin(a<<2)) # 将8右移2位
运行代码,结果如下所示:
0b100000
右移n位相当于操作数除以2的n次方,根据此原理可借助乘法运算符实现右移功能,例如,10右移3位,利用乘法运算符进行计算即为10÷23。
3. 按位与运算符(&)
按位与是指将参与运算的两个操作数对应的二进制位进行“与”操作。当对应的两个二进制位均为1时,结果位就为1,否则为0。以十进制9和3为例,它们转换为二进制后分别是00001001和00000011,转换后的二进制数进行按位与操作的结果如图3所示。
图3 按位与
从图3中可以,二进制数00001001和00000011进行按位与操作后的结果为00000001。接下来,通过代码实现9和3按位与操作,示例如下:
a = 9
b = 3
print(bin(a&b)) # 9和3按位与操作
运行代码,结果如下所示:
0b1
4. 按位或运算符(|)
按位或是指将参与运算的两个操作数对应的二进制位进行“或”操作。若对应的两个二进制位有一个为1时,结果位就为1。若参与运算的数值为负数,参与运算的两个数均以补码出现。以十进制8和3为例,8和3转换为二进制后分别是00001000和00000011,转换后的二进制数进行按位或操作的结果如图4所示。
图4 按位或
从图4中可以看出,二进制数00001000和00000011进行按位或操作后的结果为00001011。接下来,通过代码实现8和3按位或操作,示例如下:
a = 8
b = 3
print(bin(a|b)) # 8和3按位或操作
运行代码,结果如下所示:
0b1011
5. 按位异或运算符(^)
按位异或是指将参与运算的两个操作数对应的二进制位进行“异或”操作。当对应的两个二进制位中有一个为1,另一个为0时,结果位为1,否则结果位为0。以十进制8和4为例,8和4转换为二进制后分别是00001000和00000100,转换后的二进制数进行按位异或操作的结果如图5所示。
图5 按位异或
从图25中可以看出,二进制数00001000和00000100进行按位异或操作后的结果为00001100。接下来,通过代码实现8和4异或操作,示例如下:
a = 8
b = 4
print(bin(a^b)) # 8和4按位异或操作
运行代码,结果如下所示:
0b1100
6. 按位取反运算符(~)
按位取反是指将二进制的每一位进行取反,0取反为1,1取反为0。按位取反操作首先会获取这个数的补码,然后对补码进行取反,最后将取反结果转换为原码,例如,对9按位取反的计算过程如下。
(1) 因为9是正数,计算机中正数的原码=反码=补码,所以9的补码为00001001。
(2) 对正数9的补码00001001进行取反操作,取反后结果为补码11110110。
(3) 将补码00001001转换为原码时,符号位不变,其他位取反,然后+1得到原码,最终结果为10001010,即-10。
正数9按位取反的计算过程如图6所示。
图6 按位取反
从图6中可以看出,9对应的二进制数00001001按位取反后的结果为10001010。接下来,通过代码实现9按位取反操作,示例如下:
a = 9
print(bin(~a)) # 9按位取反操作
运行代码,结果如下所示:
-0b1010