将数据转成二进制然后进行计算

&(按位与)

先把运算数(这个运算数只能是十进制编码,也就是整数)解算成二进制编码,不够八位的在左边补0补满八位,然后把两个二进制编码对齐,相同位置如果都是1,新的二进制编码在对应位置生成1,如果相同位置有一个不是1或者都是0,那么新的二进制编码在对应位置生成0,最终把新生成的二进制编码转为十进制编码输出

print(4 & 8)

运行结果:

  • 0

为什么输出的是0,解答:

数值二进制编码补满八位
410000000100
8100000001000

两个编码没有相同位置都为1的,经过 &(按位与) 的运算,得出新的二进制编码为00000000,转换为十进制输出结果为0

|(按位或)

先把运算数(这个运算数只能是十进制编码,也就是整数)解算成二进制编码,不够八位的在左边补0补满八位,然后把两个二进制编码对齐,相同位置如果都是0,新的二进制编码在对应位置生成0,如果相同位置有一个不是0或者都是1,那么新的二进制编码在对应位置生成1,最终把新生成的二进制编码转为十进制编码输出

print(4 | 8)

运行结果:

  • 12

为什么输出的是12,解答:

数值二进制编码补满八位
410000000100
8100000001000

两个编码分别在第三位第四位有一个1,经过 |(按位或) 的运算,得出新的二进制编码为00001100,转换为十进制输出结果为12

<<(左移位)

先把运算数(这个运算数只能是十进制编码,也就是整数)解算成二进制编码,不够八位的在左边补0补满八位,然后按照设定的位数,把二进制编码向左移动位置,移动几个位置,就在右侧补几个0,这时候编码不止八位了,舍弃掉左边超出的部分(如果超出部分有1,那么超出部分从左到右第一个1的位置开始保留下来,这种情况下,允许二进制编码超过八位),得出最终的二进制编码转为十进制编码输出

print(4 << 1)

运行结果:

  • 8

为什么输出的是8,解答:

数值二进制编码补满八位
410000000100

按设置,二进制编码向左移动一个位置,得到新的编码为000001000,超出了八位,舍弃掉左边超出部分,变成00001000,转换为十进制输出结果为8(也可以理解为每向左移一个位置,就把原来数值乘以24 * 2 = 8

关于移位后超出部分的舍弃与保留

print(4 << 7)

运行结果:

  • 512
数值二进制编码补满八位左移位7位舍弃超出部分
4100000001000000010000000001000000000

4的二进制编码补满八位后为00000100,向左移动7个位置后变成000001000000000,超过八位变成十五位编码,本来需要舍弃左边的超出部分变成八位的,但因为超出部分含有1,所以只能舍弃超出部分的五个0,从1开始保留,最后变成十位的二进制编码1000000000

>>(右移位)

先把运算数(这个运算数只能是十进制编码,也就是整数)解算成二进制编码,不够八位的在左边补0补满八位,然后按照设定的位数,把二进制编码向右移动位置,移动几个位置,就在左侧补几个0,这时候编码不止八位了,舍弃掉右边超出的部分,得出最终的二进制编码转为十进制编码输出

print(4 >> 1)

运行结果:

  • 2

为什么输出的是2,解答:

数值二进制编码补满八位
410000000100

按设置,二进制编码向右移动一个位置,得到新的编码为000000100,超出了八位,舍弃掉右边超出部分,变成00000010,转换为十进制输出结果为2(也可以理解为每向右移一个位置,就把原来数值除以24 / 2 = 2 ,但是移动超过一定的位数或者移动超过8位,最后的输出结果会变成0,例如4的二进制编码为00000100,向右移动三个位置,编码就变成00000000了,任意八位的二进制编码向右移动八个位置,都会变成00000000

print(4 >> 3)
print(255 >> 8)  # 255的二进制编码为11111111

运行结果:

  • 0
  • 0
最后修改:2021 年 06 月 05 日 11 : 06 AM