Почему ~ True приводит к -2?

В консоли Python:

~True

Дает мне:

-2

Почему? Может ли кто-нибудь объяснить этот конкретный случай мне в двоичном формате?

Ответ 1

int(True) равно 1.

1 это:

00000001

и ~1 это:

11111110

Который является -2 в двух дополнениях 1

1 Отразите все биты, добавьте 1 к результирующему числу и интерпретируйте результат как двоичное представление величины и добавьте отрицательный знак (так как число начинается с 1):

11111110 → 00000001 → 00000010 
         ↑          ↑ 
       Flip       Add 1

Который равен 2, но знак отрицательный, поскольку MSB равен 1.


Стоит отметить:

Подумайте о bool, вы обнаружите, что он по своей природе числовой - он имеет два значения, True и False, и это просто "настраиваемые" версии целых чисел 1 и 0, которые печатаются по-разному. Они являются подклассами целочисленного типа int.

Таким образом, они ведут себя точно как 1 и 0, за исключением того, что bool переопределяет str и repr чтобы отобразить их по-разному.

>>> type(True)
<class 'bool'>
>>> isinstance(True, int)
True

>>> True == 1
True
>>> True is 1  # they're still different objects
False

Ответ 2

Тип Python bool является подклассом int (по историческим причинам, булевы были добавлены только в Python 2.3).

Так как int(True) есть 1, ~True есть ~1 is -2.

Смотрите PEP 285, почему bool является подклассом int.

Если вам нужен логический обратный, используйте not:

>>> not True
False
>>> not False
True

Если вы хотите знать, почему ~1 есть -2, это потому, что вы инвертируете все биты в целое число со знаком; 00000001 становится 1111110, который в значении целого числа является отрицательным числом, см. Два дополнения:

>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'

где начальный бит 1 означает отрицательное значение, а остальные биты кодируют инверсию положительного числа минус один.

Ответ 3

~True == -2 не удивительно, если True означает 1 и ~ означает побитное обращение...

... при условии, что

  • True можно рассматривать как целое число и
  • целые числа представлены в Два дополнения

Изменения:

  • исправлено смешение между целым представлением и оператором побитовой инверсии
  • применяет другую полировку (чем короче сообщение, тем больше требуется для работы)