最近发现了一个很有意思的问题,直接上代码:
5>3 and 10<9
# 结果显而易见是False
从逻辑运算的角度来说,前面的运算结果为True,后面的运算结果为False,and表示与运算,即两者都为True,才能为True,因此结果为False。
接下来试试并应该和and逻辑运算相同结果的符号“&”,上代码:
5>3 & 10<9
#经过测试,该结果为True
(5>3) & (10<9)
#上述结果为False,与and运算结果相同
查了一些资料得到是因为&进行了优先运算,有一定的priority优先级。那么&运算是什么结果呢?
3 & 10
# 结果为2
那就能够解释上述5>3 & 10<9的结果转变为5>2<9,从左向右得到结果True,因此转变为如下问题。
Q:为什么3&10的结果为2呢?
A:符号&表示的为位与操作,即将两数的二进制表示的每一位进行逻辑与操作,与逻辑是两个二进制都为1,结果才能得到1,否则为0。3的二进制为11,10的二进制为1010,按照位与操作的结果为0010,此种不足的位置补位0,即3变为0011,与1010进行计算。用十进制转化结果0010,得到数值结果2。
|与or运算如上同理,上代码。
5>3 or 10<9
# 结果显而易见是True
5>3 | 10<9
# 结果为False
(5>3) | (10<9)
# 结果为True 问题一样
3 | 10
# 结果是11
Q:为什么3|10的结果为11呢?
A:符号&表示的为位或操作,即将两数的二进制表示的每一位进行逻辑或操作,或逻辑是只要有一个数为1,结果为1,只有两个数都为0,才能计算为0。3的二进制为11,10的二进制为1010,按照位或操作的结果为1011。用十进制转化结果1011,得到数值结果11。