В консоли 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 можно рассматривать как целое число иИзменения: