In Python Konsole:Warum ergibt ~ True in -2?
~True
Gibt mir:
-2
Warum? Kann mir jemand diesen speziellen Fall im Binärformat erklären?
In Python Konsole:Warum ergibt ~ True in -2?
~True
Gibt mir:
-2
Warum? Kann mir jemand diesen speziellen Fall im Binärformat erklären?
Was ist int(True)
? Es ist 1
.
1
ist:
00000001
und ~1
ist:
11111110
Welche -2
in Two's complement
Flip alle Bits ist, fügen Sie 1 zu dem resultierenden Nummer und Interp ret das Ergebnis als Binärdarstellung der Größe und fügt ein negatives Vorzeichen (da die Zahl mit 1 beginnt):
11111110 → 00000001 → 00000010
↑ ↑
Flip Add 1
davon 2 ist, aber das Vorzeichen negativ ist, da die MSB ist 1.
erwähnens~~POS=TRUNC:
Denken Sie bool
, werden Sie feststellen, dass es in der Natur numerisch ist - es hat zwei Werte, True
und False
, und sie ein re nur "angepasste" Versionen der Ganzzahlen 1 und 0, die sich nur unterschiedlich ausdrucken.Sie sind Unterklassen des Integer-Typs int
.
Sie verhalten sich also genauso wie 1 und 0, mit der Ausnahme, dass bool
str
und repr
neu definiert, um sie anders anzuzeigen.
>>> type(True)
<class 'bool'>
>>> isinstance(True, int)
True
>>> True == 1
True
>>> True is 1 # they're still different objects
False
@ofcapl Ich wollte nur sagen: Obwohl 'int ('1')' auch '1' ist, ist '~' 1 '' eine typefehler Ausnahme, '' True' ist nicht, weil 'bool' eine Unterklasse von ist 'int' @ Martijn fügte diese Information in seiner Antwort hinzu. –
Für die Aufzeichnung, @ofcapl, zeigt diese Antwort die binäre arithmetische Interpretation von dem, was vor sich geht, nicht der tatsächliche [Bytecode] (http://en.wikipedia.org/wiki/Bytecode) (was eine Art Zwischenprodukt oder sein würde Code der Operationsebene, der aus der Quelle kompiliert wurde). –
@PatrickM Ich denke, er meinte binäre Arithmetik und nicht * Bytecode * .. – Maroun
Der Python bool
Typ ist eine Unterklasse von int
(aus historischen Gründen; booleans wurden nur in Python 2.3 hinzugefügt).
Seit int(True)
ist 1
, ~True
ist ~1
-2
ist.
Siehe PEP 285 für warum bool
ist eine Unterklasse von int
.
Wenn Sie die Boolesche inverse wollte, verwenden not
:
>>> not True
False
>>> not False
True
Wenn Sie wissen wollen, warum ~1
-2
ist, ist es, weil Sie alle Bits in einer Ganzzahl mit Vorzeichen sind invertiert; 00000001
wird 1111110
, die in einer signierten ganzen Zahl eine negative Zahl ist, siehe Two's complement:
>>> # Python 3
...
>>> import struct
>>> format(struct.pack('b', 1)[0], '08b')
'00000001'
>>> format(struct.pack('b', ~1)[0], '08b')
'11111110'
wobei der anfänglich 1
Bit bedeutet der Wert negativ ist, und der Rest der Bits codiert die Inverse der positiven Zahl minus ein.
Haben wir irgendeine Funktion, um Bits in Python anzuzeigen? –
@GrijeshChauhan ['bin'] (http://docs.python.org/2/library/functions.html#bin) – thefourtheye
@GrijeshChauhan: Für das Kompliment von zwei könnte man' struct.pack' als 'bin (integer) 'oder' format (integer, '08b') 'berücksichtigen Sie keine vorzeichenbehafteten Ganzzahlen. –
~True == -2
ist nicht verwunderlich, wennTrue
bedeutet 1
und~
bedeutet bitweise Inversion ...
... vorausgesetzt, dass
True
behandelt werden können, als eine ganze Zahl undEdits dargestellt:
'~' bedeutet nicht "2s Komplement". '~' bedeutet "Bitweises Inversion" – McKay
http://docs.python.org/2/library/operator.html – McKay
Der Ausdruck "Ones Komplement" bezieht sich nicht wirklich auf eine Operation, so sehr wie es sich auf a bezieht System zum Speichern von ganzen Zahlen in Bits. Ein System, das nicht wirklich in einem Computersystem verwendet wird. – McKay
weil '~ 1' ist' -2', Versuch: 'True == 1' –
Genau genommen: Es ist nicht wahr, dass" True 1 "ist, aber es ist wahr, dass True == 1 ist . – Bach
Glaubst du wirklich, dass 'UNARY_INVERT' (der gesamte Bytecode) etwas zu den Antworten hinzufügen wird? – geoffspear