学科分类
目录
基础

位运算符

位运算符用于按二进制位进行逻辑运算,操作数必须为整数。下面介绍位运算符的功能,并以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所示。

img

图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所示。

img

图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所示。

img

图3 按位与

从图3中可以,二进制数00001001和00000011进行按位与操作后的结果为00000001。接下来,通过代码实现9和3按位与操作,示例如下:

a = 9
b = 3
print(bin(a&b))                    # 93按位与操作

运行代码,结果如下所示:

0b1

4. 按位或运算符(|)

按位或是指将参与运算的两个操作数对应的二进制位进行“或”操作。若对应的两个二进制位有一个为1时,结果位就为1。若参与运算的数值为负数,参与运算的两个数均以补码出现。以十进制8和3为例,8和3转换为二进制后分别是00001000和00000011,转换后的二进制数进行按位或操作的结果如图4所示。

img

图4 按位或

从图4中可以看出,二进制数00001000和00000011进行按位或操作后的结果为00001011。接下来,通过代码实现8和3按位或操作,示例如下:

a = 8
b = 3
print(bin(a|b))                    # 83按位或操作

运行代码,结果如下所示:

0b1011

5. 按位异或运算符(^)

按位异或是指将参与运算的两个操作数对应的二进制位进行“异或”操作。当对应的两个二进制位中有一个为1,另一个为0时,结果位为1,否则结果位为0。以十进制8和4为例,8和4转换为二进制后分别是00001000和00000100,转换后的二进制数进行按位异或操作的结果如图5所示。

img

图5 按位异或

从图25中可以看出,二进制数00001000和00000100进行按位异或操作后的结果为00001100。接下来,通过代码实现8和4异或操作,示例如下:

a = 8
b = 4
print(bin(a^b))                    # 84按位异或操作

运行代码,结果如下所示:

0b1100

6. 按位取反运算符(~)

按位取反是指将二进制的每一位进行取反,0取反为1,1取反为0。按位取反操作首先会获取这个数的补码,然后对补码进行取反,最后将取反结果转换为原码,例如,对9按位取反的计算过程如下。

(1) 因为9是正数,计算机中正数的原码=反码=补码,所以9的补码为00001001。

(2) 对正数9的补码00001001进行取反操作,取反后结果为补码11110110。

(3) 将补码00001001转换为原码时,符号位不变,其他位取反,然后+1得到原码,最终结果为10001010,即-10。

正数9按位取反的计算过程如图6所示。

img

图6 按位取反

从图6中可以看出,9对应的二进制数00001001按位取反后的结果为10001010。接下来,通过代码实现9按位取反操作,示例如下:

a = 9
print(bin(~a))                    # 9按位取反操作

运行代码,结果如下所示:

-0b1010
点击此处
隐藏目录