将数据转成二进制然后进行计算
&
(按位与)
先把运算数(这个运算数只能是十进制编码,也就是整数)解算成二进制编码,不够八位的在左边补0
补满八位,然后把两个二进制编码对齐,相同位置如果都是1
,新的二进制编码在对应位置生成1
,如果相同位置有一个不是1
或者都是0
,那么新的二进制编码在对应位置生成0
,最终把新生成的二进制编码转为十进制编码输出
print(4 & 8)
运行结果:
- 0
为什么输出的是0
,解答:
数值 | 二进制编码 | 补满八位 |
---|---|---|
4 | 100 | 00000100 |
8 | 1000 | 00001000 |
两个编码没有相同位置都为1
的,经过 &
(按位与) 的运算,得出新的二进制编码为00000000
,转换为十进制输出结果为0
|
(按位或)
先把运算数(这个运算数只能是十进制编码,也就是整数)解算成二进制编码,不够八位的在左边补0
补满八位,然后把两个二进制编码对齐,相同位置如果都是0
,新的二进制编码在对应位置生成0
,如果相同位置有一个不是0
或者都是1
,那么新的二进制编码在对应位置生成1
,最终把新生成的二进制编码转为十进制编码输出
print(4 | 8)
运行结果:
- 12
为什么输出的是12
,解答:
数值 | 二进制编码 | 补满八位 |
---|---|---|
4 | 100 | 00000100 |
8 | 1000 | 00001000 |
两个编码分别在第三位第四位有一个1
,经过 |
(按位或) 的运算,得出新的二进制编码为00001100
,转换为十进制输出结果为12
<<
(左移位)
先把运算数(这个运算数只能是十进制编码,也就是整数)解算成二进制编码,不够八位的在左边补0
补满八位,然后按照设定的位数,把二进制编码向左移动位置,移动几个位置,就在右侧补几个0
,这时候编码不止八位了,舍弃掉左边超出的部分(如果超出部分有1
,那么超出部分从左到右第一个1
的位置开始保留下来,这种情况下,允许二进制编码超过八位),得出最终的二进制编码转为十进制编码输出
print(4 << 1)
运行结果:
- 8
为什么输出的是8
,解答:
数值 | 二进制编码 | 补满八位 |
---|---|---|
4 | 100 | 00000100 |
按设置,二进制编码向左移动一个位置,得到新的编码为000001000
,超出了八位,舍弃掉左边超出部分,变成00001000
,转换为十进制输出结果为8
(也可以理解为每向左移一个位置,就把原来数值乘以2
,4 * 2 = 8
)
关于移位后超出部分的舍弃与保留
print(4 << 7)
运行结果:
- 512
数值 | 二进制编码 | 补满八位 | 左移位7位 | 舍弃超出部分 |
---|---|---|---|---|
4 | 100 | 00000100 | 000001000000000 | 1000000000 |
4
的二进制编码补满八位后为00000100
,向左移动7
个位置后变成000001000000000
,超过八位变成十五位编码,本来需要舍弃左边的超出部分变成八位的,但因为超出部分含有1
,所以只能舍弃超出部分的五个0
,从1
开始保留,最后变成十位的二进制编码1000000000
>>
(右移位)
先把运算数(这个运算数只能是十进制编码,也就是整数)解算成二进制编码,不够八位的在左边补0
补满八位,然后按照设定的位数,把二进制编码向右移动位置,移动几个位置,就在左侧补几个0
,这时候编码不止八位了,舍弃掉右边超出的部分,得出最终的二进制编码转为十进制编码输出
print(4 >> 1)
运行结果:
- 2
为什么输出的是2
,解答:
数值 | 二进制编码 | 补满八位 |
---|---|---|
4 | 100 | 00000100 |
按设置,二进制编码向右移动一个位置,得到新的编码为000000100
,超出了八位,舍弃掉右边超出部分,变成00000010
,转换为十进制输出结果为2
(也可以理解为每向右移一个位置,就把原来数值除以2
,4 / 2 = 2
,但是移动超过一定的位数或者移动超过8
位,最后的输出结果会变成0
,例如4
的二进制编码为00000100
,向右移动三个位置,编码就变成00000000
了,任意八位的二进制编码向右移动八个位置,都会变成00000000
)
print(4 >> 3)
print(255 >> 8) # 255的二进制编码为11111111
运行结果:
- 0
- 0