используя метод "__and__" в абстрактном базовом классе int - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь понять метод __and__ абстрактного базового класса int.Здесь я назвал метод двумя разными способами.Почти во всех случаях оба способа ведут себя как я ожидаю, они выводят второе значение, потому что оба значения являются «правдивыми».Но в особом случае, когда сумма двух чисел = -1, тогда первый способ выводит 0. Кто-нибудь может сказать почему?

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

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Проблема не в операторе __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).

0 голосов
/ 05 июля 2019

Одноклассник отметил, что в методах и () используется "побитовое и". Не нормальное И. Кроме того, в вычислениях я использовал целые числа со знаком вместо дополнения до двух.

...