位运算符属于更细微的操作,它是针对每个字节中的每个位(bit)进行操作的
运算符 | 描述 |
---|---|
& | 按位“与” |
| | 按位“或” |
^ | 按位“异或” |
~ | 按位“取反” |
<< | 按位左移 |
>> | 按位右移 |
位运算符在网络通信、硬件驱动领域应用得比较广泛。在编写应用层程序时,用“位”来存储取值范围小的整型变量,可以一定程度地节省内存空间。
下面通过一段程序来演示“位运算符”的使用。示例如下,定义两个变量,分别按照表中的运算符对其运算,观察运算结果。
定义两个变量 a 和 b,其中 a 的值为 1,b 的值为 3,按照表中的赋值运算符,对其进行“与”“或”“异或”等操作。代码如下:
a=1 # 01
b=3 # 101
print(a&b) #结果为 001
print(a|b) #结果为
print(a^b)
print(a<<b)
print(a>>b)
输出结果:
1
3
2
8
0
上面的代码每行后面都配有该代码输出的结果。读者可以对比代码和输出结果体会每个操作符的含义.
代码解析
1) 按位 &
按位与运算 按位与运算符“&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。只要对应的二个二进位都为 1 时,结果位就为 1,否则为 0。法则如下:
1&1=1
1&0=0
0&1=0
0&0=0
上述代码中 1 的二进制是 01;3 的二进制数是 101 按照上述运算法则,结果为 01,因此结果为 1
2) 按位 |
按位或运算 按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。
1|1=1
1|0=1
0|1=1
0|0=0
上述代码中 1 的二进制是 01;3 的二进制数是 101 按照上述运算法则计算,结果为 01,因此结果为 3
3) 按位异或
进行异或运算时,当前位的两个二进制表示不同则为 1 相同则为0。
1^1=0
1^0=1
0^1=1
0^0=0
上述代码中 1 的二进制是 01;3 的二进制数是 101 按照上述运算法则计算,结果为 01,因此结果为 2
4) 按位取反
进行按位取反时,就是把操作数的二进制每一位都取反,比如 1 的八位二进制数表示为 0000,0001 取反的结果为 11111110,最高为为符号位(即表示正负,最高位为 1 表示 负数,0 表示正数)。
负数在计算机中是以补码的形式存在的,补码 = 反码 + 1,即 1111 1111,这就是 -1 在计算机中存在形式。
为什么是 8位表示二进制数?
拓展:八位(8bit)是一个字节,计算机中只要一个字节就可以存放ASCII编码,就是所有的数字、大小写字母和一些特殊字符(总共255个)。所以在计算机中对用户来说有意义的单位就是字节,这是我们可以看懂的。八位的二进制数最大值就是255,刚好表示255个ASCII字符。我们汉字使用的是unicode编码的,unicode编码要用两个字节,所以要存放16位二进制数才能代表一个unicode字符。另外还有UTF8编码占四个字节等等。
5) 按位左移
将操作数的二进制所有位向左移动指定的位数。
例如 1 的八位二进制数是 0000 0001 现在向左移动两位( a<< 2),结果为 00000100 ,结果为 4。
6) 按位右移
将操作数的二进制所有位向右移动指定的位数。
例如 10 的二进制数是 00001010 现在向右移动两位(a>>2),结果位 00000010,即被挤走了最后两位,结果为 2。
上述就是关于位运算符的详解介绍,值得注意的是,位运算符是计算机中通用符号,不仅 Python 中存在,其他编程语言中也存在,并且使用方法相同。