根据我对按位运算符的理解,以下代码仅应在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
问题:
i和j的二进制值仅在第一种情况下为1,那么为什么还要打印其他情况?
为什么在i&j评估为5的地方打印结果
如果我更改上述if语句中的条件顺序,则i会获取值5、7、13、15、21、23、29,而j仍为5,其他输出也相同。为什么?
对于上述代码,i = 7且j = 5,i&j也计算为5。那为什么不打印呢?
答案 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:
参考2:
答案 1 :(得分:2)
与C不同,Python中的所有比较运算都具有相同的优先级,该优先级低于任何算术运算,移位运算或按位运算。同样与C不同,像
所以在这里:
i == 5 & j == 5
发生的情况是,针对5 & j
和i
对5
进行了相等性测试。因此,括号会起作用,但正确的方法是使用优先级更高的 logical and
运算符:
i == 5 and j == 5
它也短路,这意味着如果i != 5
,j
甚至没有经过测试(执行速度更快)。完全适用于此示例。
答案 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))
它的详细工作原理可以在这里找到: