为什么下面的代码输出是这样的

时间:2019-08-29 19:27:11

标签: python bitwise-and

根据我对按位运算符的理解,以下代码仅应在i和j都等于5时执行,如果条件值应为False,则对于i和j的所有其他值。但我得到以下输出:

for i in range(30):
    for j in range(30):
        if i == 5 & j == 5:
            print(i, j, i & j, bin(i==5), bin(j==5), i == 5 & j == 5)

输出:

# i, j, i & j, binary value of i, binary value of j, bitwise and of i == 5 and j == 5
5 5 5 0b1 0b1 True
5 7 5 0b1 0b0 False
5 13 5 0b1 0b0 False
5 15 5 0b1 0b0 False
5 21 5 0b1 0b0 False
5 23 5 0b1 0b0 False
5 29 5 0b1 0b0 False

问题:

  1. i和j的二进制值仅在第一种情况下为1,那么为什么还要打印其他情况?

  2. 为什么在i&j评估为5的地方打印结果

  3. 如果我更改上述if语句中的条件顺序,则i会获取值5、7、13、15、21、23、29,而j仍为5,其他输出也相同。为什么?

  4. 对于上述代码,i = 7且j = 5,i&j也计算为5。那为什么不打印呢?

3 个答案:

答案 0 :(得分:2)

使用运算符“和”而不是“&”。它将解决您的问题。

and:逻辑运算符
&:按位运算符

for i in range(30):
    for j in range(30):
        if i == 5 and j == 5:
            print(i, j, i & j, bin(i==5), bin(j==5), i == 5 & j == 5)

结果:

5 5 5 0b1 0b1 True

参考文献1:

Difference between 'and' (boolean) vs. '&' (bitwise) in python. Why difference in behavior with lists vs numpy arrays?

参考2:

https://stackoverflow.com/a/3845072/1855988

答案 1 :(得分:2)

documentation

  

与C不同,Python中的所有比较运算都具有相同的优先级,该优先级低于任何算术运算,移位运算或按位运算。同样与C不同,像

所以在这里:

i == 5 & j == 5

发生的情况是,针对5 & ji5进行了相等性测试。因此,括号会起作用,但正确的方法是使用优先级更高的 logical and运算符:

i == 5 and j == 5

它也短路,这意味着如果i != 5j甚至没有经过测试(执行速度更快)。完全适用于此示例。

答案 2 :(得分:1)

简短答案,您错过了方括号:

for i in range(30):
    for j in range(30):
        if (i == 5) &  (j == 5):
            print(i, j, i & j, bin(i==5), bin(j == 5), i == 5 & j == 5)

首先评估(i == 5)和(j == 5),然后将生成的布尔值与其他生成的布尔值进行比较。

或者如下所述,只需使用and。如果您想进一步了解这一点,请查看以下结果:

for x in range(0, 32):
    print(x & 2, bin(x), bin(2), bin(x & 2))

它的详细工作原理可以在这里找到:

https://wiki.python.org/moin/BitwiseOperators