В консоли Python:
~True
Дает мне:
-2
Почему? Может ли кто-нибудь объяснить этот конкретный случай мне в двоичном формате?
В консоли Python:
~True
Дает мне:
-2
Почему? Может ли кто-нибудь объяснить этот конкретный случай мне в двоичном формате?
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
Тип 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
означает отрицательное значение, а остальные биты кодируют инверсию положительного числа минус один.
~True == -2
не удивительно, если True
означает 1
и ~
означает побитное обращение...
... при условии, что
True
можно рассматривать как целое число иИзменения: