位运算符只能对int类型的数据进行计算,位运算符的计算方式是按照整数在内存中的二进制形式进行计算。python的位运算符一共有6种,分别是: 按位与,按位或,按位异或,按位取反,左移,右移运算。位运算符是一种非常底层的操作,因此它的效率很高。
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与运算符:参与运算的两个值,对应为都为1,则结果位为1,否则为0 | 1 & 2 = 0 |
| | 按位或运算符:参与运算的两个值,对应位只要有一个为1,结果位则为1 | 1 | 2 = 3 |
^ | 按位异或运算符:参与计算的连个值,对应位不同,则结果位为1,对应位相同,则结果位为0 | 1 ^ 2 = 3 |
~ | 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 | ~5 = 2 |
<< | 左移动运算符:运算数的各二进位全部左移若干位,高位丢弃,低位补0。 | 2 << 2= 8 |
>> | 右移动运算符:参与运算的值的各二进位全部右移若干位 | 8 >> 1 = 4 |
位运算是在2进制的层面上对数据进行计算,下面逐个解释上表中的例子,在32位机器上,c语言中的int类型数据占4个字节,也就是32个比特位,3的二进制表示形式为
00000000 00000000 00000000 00000011
在python语言中,一个int类型占多少字节不是固定的,因此下面的讲解中,我在描述一个数值的二进制时,低8位。
1 的二进制表示形式是 00000001
2 的二进制表示形式是 00000010
对应为进行与运算,只有都为1时,结果位才会为1,因此最终结果为为 0000000,转成10进制是0
下面再举一个例子,你自己可以同时进行运算
1 & 3 = 1
00000001 1的二进制
00000011 3的二进制
00000001 1的二进制
1 的二进制表示形式是 00000001
2 的二进制表示形式是 00000010
对应为只要有一个是1,那么结果位就是1,对应位都是0,则结果位是0,最终结果是00000011 ,转换成10进制是3
下面再举一个例子,你自己可以实验一下
4 | 8 = 12
00000100 4的二进制
00001000 8的二进制
00001100 12的二进制
1 的二进制表示形式是 00000001
2 的二进制表示形式是 00000010
对应位不同,则结果位是1,对应位相同,则结果位是0,计算结果为00000011,转换成10进制为3
下面再举一个例子,你自己可以实验一下
4 ^ 5 = 1
00000100 4的二进制
00000101 5的二进制
00000001 1的二进制
按位取反时,二进制的0变成1,1变成0
理解按位取反运算,先要理解几个基本概念
原码: 一个整数,按照绝对值大小转换成的二进制数,称为原码,2 的原码是10, -3的原码是11
反码: 将二进制数按位取反,所得的新二进制数称为原二进制数的反码
补码:反码加1称为补码
计算~5的结果:
按位取反计算逻辑可以总结为: ~n = -(n+1)
print(bin(~5))
程序输出结果
-0b110
2 << 2
2 的二进制表示形式 00000010
向左移动2位后变成 00001000
左移动,相当于乘2,左移动多少,就乘多少次2
3 << 4 等价于 3 * (2**4) = 3*16 = 48
8 >> 1
8的二进制表示形式 00001000
向右移动1, 00000100 ,转成10进制是4
右移动,相当于除2,右移动多少,就除多少次2
17 >> 2 等价于17除 2**2 ,等价于17/4 = 4
00010001 17的二进制
向右移动两位
00000100 转成10进制是4
QQ交流群: 211426309