In der Python-Konsole:
~True
Gibt mir:
-2
Warum? Kann mir jemand diesen speziellen Fall binär erklären?
python
data-conversion
tilde
lukaszkups
quelle
quelle
~1
ist-2
, versuchen Sie:True == 1
True is 1
", aber es ist wahr, dassTrue == 1
.UNARY_INVERT
(der gesamte Bytecode) den Antworten etwas hinzufügen wird?bool
. Es geht nicht darum, wie es~
funktioniert. Tatsächlich könnte eine gültige Antwort auf diese Frage vermeiden, das Komplement von 2 und die Funktionsweise~
von ganzen Zahlen überhaupt zu erwähnen .Antworten:
int(True)
ist1
.1
ist:und
~1
ist:Welches ist
-2
in Two's Komplement 11 Drehen Sie alle Bits um, addieren Sie 1 zur resultierenden Zahl und interpretieren Sie das Ergebnis als binäre Darstellung der Größe und fügen Sie ein negatives Vorzeichen hinzu (da die Zahl mit 1 beginnt):
Welches ist 2, aber das Vorzeichen ist negativ, da das MSB 1 ist.
Erwähnenswert:
Denken
bool
Sie daran, Sie werden feststellen, dass es numerischer Natur ist - Es hat zwei Werte,True
undFalse
es handelt sich lediglich um "angepasste" Versionen der Ganzzahlen 1 und 0, die sich nur unterschiedlich drucken. Sie sind Unterklassen vom Typ Integerint
.Sie verhalten sich also genau wie 1 und 0, außer dass sie
bool
neu definiertstr
undrepr
unterschiedlich angezeigt werden.quelle
int('1')
auch ist1
aber~'1'
eine Typeerror - Ausnahme sein , während~True
nicht das ist , weilbool
es eine Unterklasse vonint
@ Martijn diese Informationen in seiner Antwort gegeben.True == -1
, und ich kenne viele wo man das sagen könnteTrue == 1
...-1
für TRUE. Es hat die nette Eigenschaft, dass die bitweisen UND- und ODER-Operatoren auch für logisches UND und ODER funktionieren (x & -1
in den gleichen Fällenx && 1
ungleich Null wie in C ungleich Null), solange Sie sich nicht für Kurzschlüsse interessieren . Soweit ich weiß, hat jedoch noch nie eine Mainstream-Sprache-1
für TRUE verwendet.truth
als univaliert; mit allem was nichttrue
istfalse
. Alle Programmiersprachen, die mir bekannt sind, stellen die formale Logik auf den Kopf und definieren siefalse
als univaliert (0) und alles, was nicht falsch isttrue
. Zum Beispiel C # , obwohl Javascript so etwas wie ein Ausreißer ist und mehrere Arten von Wahrhaftigkeit und mehrere Arten von Falschheit aufweist .Der Python-
bool
Typ ist eine Unterklasse vonint
(aus historischen Gründen; Boolesche Werte wurden nur in Python 2.3 hinzugefügt).Da
int(True)
ist1
,~True
ist~1
ist-2
.In PEP 285 erfahren Sie, warum
bool
es sich um eine Unterklasse von handeltint
.Wenn Sie die boolesche Umkehrung wünschen, verwenden Sie
not
:Wenn Sie wissen möchten, warum dies so
~1
ist-2
, liegt dies daran, dass Sie alle Bits in einer vorzeichenbehafteten Ganzzahl invertieren.00000001
wird,1111110
was in einer vorzeichenbehafteten Ganzzahl eine negative Zahl ist, siehe Zweierkomplement :Dabei bedeutet das Anfangsbit,
1
dass der Wert negativ ist, und der Rest der Bits codiert die Umkehrung der positiven Zahl minus eins.quelle
struct.pack
, wiebin(integer)
oderformat(integer, '08b')
nehmen Sie nicht unterzeichnet ganzen Zahlen berücksichtigt.bin(~True)
,bin(-2)
,bin(~1)
gibt all'-0b10'
Wenn-2
Darstellung ist10
dann , warum-
Zeichen.10
ich dann selbst als Komplement?format(-2 % (1 << 32), "032b")
format(-2 & ((1 << 32) - 1), "032b")
~True == -2
ist nicht überraschend, wennTrue
Mittel1
und~
Mittel bitweise Inversion bedeuten ...... vorausgesetzt das
True
kann als ganze Zahl behandelt werden undBearbeitungen:
quelle
~
bedeutet nicht "2s Komplement".~
bedeutet "Bitweise Inversion"