В консоли Python:
~True
Дает мне:
-2
Зачем? Может кто-нибудь объяснить мне этот конкретный случай в двоичном виде?
python
data-conversion
tilde
lukaszkups
источник
источник
~1
есть-2
, попробуйте:True == 1
True is 1
", но это правдаTrue == 1
.UNARY_INVERT
(всего байт-кода) что-то добавит к ответам?bool
. Дело не в том, как~
работает. Фактически, правильный ответ на этот вопрос мог бы избежать упоминания дополнения 2 и того, как~
вообще работает с целыми числами.Ответы:
int(True)
есть1
.1
является:и
~1
это:Что находится
-2
в дополнении до двух 11 Переверните все биты, добавьте 1 к полученному числу и интерпретируйте результат как двоичное представление величины и добавьте отрицательный знак (поскольку число начинается с 1):
Это 2, но знак отрицательный, так как MSB равен 1.
Стоит отметить:
Подумайте
bool
, вы обнаружите, что он числовой по своей природе - он имеет два значения,True
иFalse
, и они просто «настроенные» версии целых чисел 1 и 0, которые только печатают себя по-разному. Это подклассы целочисленного типаint
.Таким образом, они ведут себя точно так же, как 1 и 0, за исключением того, что
bool
переопределяютstr
иrepr
отображают их по-разному.источник
int('1')
это тоже,1
но~'1'
это исключение typeerror, тогда как~True
это не так, потомуbool
что подклассint
@ Martijn добавил эту информацию в свой ответ.True == -1
, и я знаю многих, где это можно было сказатьTrue == 1
...-1
ИСТИНА; у него есть приятное свойство, что побитовые операторы И и ИЛИ работают также и для логических И и ИЛИ (x & -1
ненулевые в тех же случаях, чтоx && 1
ненулевые в С), если вы не заботитесь о коротком замыкании , Однако, насколько мне известно, ни один из основных языков никогда не использовался-1
для ИСТИНЫ.truth
как однозначное; со всем , что неtrue
являетсяfalse
. Все языки программирования, о которых я знаю, переворачивают формальную логику сfalse
ног на голову, определяя как однозначное (0) и все, что не является ложнымtrue
). Например, C # , хотя Javascript является чем-то особенным, имеющим несколько оттенков правдивости и несколько оттенков лжи .Тип Python
bool
является подклассомint
(по историческим причинам; логические значения были добавлены только в Python 2.3).Так как
int(True)
это1
,~True
это~1
есть-2
.См. PEP 285, чтобы узнать, почему
bool
является подклассомint
.Если вам нужна логическая инверсия, используйте
not
:Если вы хотите знать, почему
~1
это так-2
, то это потому, что вы инвертируете все биты в целое число со знаком ;00000001
становится,1111110
которое в знаковом целом числе является отрицательным числом, см . Дополнение до двух :где начальный
1
бит означает, что значение отрицательное, а остальные биты кодируют обратное положительное число минус один.источник
struct.pack
, asbin(integer)
илиformat(integer, '08b')
не учитывать целые числа со знаком .bin(~True)
,bin(-2)
,bin(~1)
все дает'-0b10'
Если-2
представление ,10
то почему-
знак.10
2'комплемента тогда -ве?format(-2 % (1 << 32), "032b")
format(-2 & ((1 << 32) - 1), "032b")
~True == -2
это не удивительно , еслиTrue
средство1
и~
средства побитовое обращение ...... при условии, что
True
можно рассматривать как целое число иРедактирование:
источник
~
не означает "дополнение до двух".~
означает «Побитовая инверсия»