位运算符

运算符描述实例
&按位与运算符:参与运算的两个值,对应为都为1,则结果位为1,否则为01 & 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

理解按位取反运算,先要理解几个基本概念

  1. 原码
  2. 反码
  3. 补码

原码: 一个整数,按照绝对值大小转换成的二进制数,称为原码,2 的原码是10, -3的原码是11

反码: 将二进制数按位取反,所得的新二进制数称为原二进制数的反码

补码:反码加1称为补码

计算~5的结果:

  1. 5 的2进制表示是 0000 0000 0000 0000 0000 0000 0000 0101
  2. 按位取反后是1111 1111 1111 1111 1111 1111 1111 1010,结果是-6,最高位是1表明它是一个负数
  3. 负数在计算机中使用补码来存储,负数的补码是其反码加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) = 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

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案