Проблема не в операторе __and__
.Побитовый оператор в python - это не and
, это &
:
>>> (7).__and__(5) == (7 & 5)
True
Что касается того, как and
взаимодействует с не булевыми значениями, вы можете прочитать этот ответ .Для вашего конкретного случая:
and
Возвращает первое значение Falsy, если оно есть, иначе возвращает последнее значение в выражении.
В вашем случае оба-4
и 3
не являются значениями Falsy, поэтому возвращается последнее значение (3
).Рассматривая то, что считается ложью , мы также можем понять, почему -4 and 0 and 3 == 0
, т. Е. Потому что 0
является ложью.
Обратите внимание, что такое поведение для оператора 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
для любого x
в 4, 5, 6, 7
(две младшие цифрывсегда отменяется завершающими нулями в двоичном представлении -4 (111100).