0

我试图了解__and__抽象基 int 类的方法。在这里,我以两种不同的方式调用了该方法。在几乎所有情况下,这两种方式的行为都符合我的预期,它们输出第二个值,因为这两个值都是“真实的”。但是在两个数字之和 = -1 的特殊情况下,第一种方式打印 0。谁能说出为什么?

value = -4
print(value.__and__(3)) # prints 0
print(value and 3)         # prints 3
4

2 回答 2

2

“问题”不在于__and__运营商。python中的按位运算符and不是&

>>> (7).__and__(5) == (7 & 5)
True

至于如何and与非布尔值交互,您可以阅读此答案。对于您的特定情况:

and如果有,则返回第一个 Falsy 值,否则返回表达式中的最后一个值。

在您的情况下,两者-43都是非 Falsy 值,因此3返回最后一个值 ( )。考虑到什么被认为是 Falsy,我们也可以理解为什么-4 and 0 and 3 == 0,即,因为0是 Falsy。

请注意,and操作员的这种行为是有意义的。它只是以最自然的方式(或至少一种最自然的方式)扩展了自然布尔值和运算符的逻辑。例如,True and False and False and x, 将在遇到False第一个时立即返回False,而True and True and x将简单地返回x,因为所有先前的布尔值都验证了全局语句。

最后,按位运算符在处理负数时明显奇怪的行为来自负数的编码方式。基本上,要将正数(例如,4 = 000100)变为负数,您只需将其所有位(111011)取反,然后加 1(111100 = -4)。在评估3 & -4中相当于解决以下问题:

  000011
& 111100
--------
= 000000

出于同样的原因x & -4,将评估4任何xin 4, 5, 6, 7(两个低位总是被 -4 的二进制表示(111100)中的终止零取消。

于 2019-07-04T23:29:51.433 回答
0

有同学指出and ()方法使用的是“按位与”。不是正常的AND。此外,我在计算中使用有符号整数而不是二进制补码。

于 2019-07-05T00:27:16.860 回答