位运算符
位运算符只能对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 |
| 按位或运算符
1 的二进制表示形式是 00000001
2 的二进制表示形式是 00000010
对应为只要有一个是1,那么结果位就是1,对应位都是0,则结果位是0,最终结果是00000011 ,转换成10进制是3
下面再举一个例子,你自己可以实验一下
4 | 8 = 12 |
^ 按位异或运算符
1 的二进制表示形式是 00000001
2 的二进制表示形式是 00000010
对应位不同,则结果位是1,对应位相同,则结果位是0,计算结果为00000011,转换成10进制为3
下面再举一个例子,你自己可以实验一下
4 ^ 5 = 1 |
~ 按位取反运算符
按位取反时,二进制的0变成1,1变成0
理解按位取反运算,先要理解几个基本概念
- 原码
- 反码
- 补码
原码: 一个整数,按照绝对值大小转换成的二进制数,称为原码,2 的原码是10, -3的原码是11
反码: 将二进制数按位取反,所得的新二进制数称为原二进制数的反码
**补码:**反码加1称为补码
计算~5的结果:
- 5 的2进制表示是 0000 0000 0000 0000 0000 0000 0000 0101
- 按位取反后是1111 1111 1111 1111 1111 1111 1111 1010,结果是-6,最高位是1表明它是一个负数
- 负数在计算机中使用补码来存储,负数的补码是其反码加1并在前面加一个负号,-6的补码是0000 0000 0000 0000 0000 0000 0000 0101,加1后并在前面加一个负号的结果是-0000 0000 0000 0000 0000 0000 0000 0110
按位取反计算逻辑可以总结为: ~n = -(n+1)
print(bin(~5)) |
程序输出结果
-0b110 |
<< 左移动运算符
2 << 2
2 的二进制表示形式 00000010
向左移动2位后变成 00001000
左移动,相当于乘2,左移动多少,就乘多少次2
3 << 4 等价于 3 * (2*4) = 316 = 48
>> 右移动运算符
8 >> 1
8的二进制表示形式 00001000
向右移动1, 00000100 ,转成10进制是4
右移动,相当于除2,右移动多少,就除多少次2
17 >> 2 等价于17除 2**2 ,等价于17/4 = 4
00010001 17的二进制 |