2014-02-19 9 views
128

In Python Konsole:Warum ergibt ~ True in -2?

~True 

Gibt mir:

-2 

Warum? Kann mir jemand diesen speziellen Fall im Binärformat erklären?

+21

weil '~ 1' ist' -2', Versuch: 'True == 1' –

+13

Genau genommen: Es ist nicht wahr, dass" True 1 "ist, aber es ist wahr, dass True == 1 ist . – Bach

+3

Glaubst du wirklich, dass 'UNARY_INVERT' (der gesamte Bytecode) etwas zu den Antworten hinzufügen wird? – geoffspear

Antwort

232

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 boolstr 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 
+1

@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. –

+0

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). –

+1

@PatrickM Ich denke, er meinte binäre Arithmetik und nicht * Bytecode * .. – Maroun

44

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.

+3

Haben wir irgendeine Funktion, um Bits in Python anzuzeigen? –

+6

@GrijeshChauhan ['bin'] (http://docs.python.org/2/library/functions.html#bin) – thefourtheye

+1

@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. –

4

~True == -2 ist nicht verwunderlich, wennTrue bedeutet 1und~ bedeutet bitweise Inversion ...

... vorausgesetzt, dass

  • True behandelt werden können, als eine ganze Zahl und
  • ganzen Zahlen sind in Two's complement

Edits dargestellt:

  • die Vermischung zwischen ganzzahligen Darstellung und bitweise Inversionsoperator
  • ein weiteres Polieren aufgetragen (je kürzer die Nachricht Fest , je mehr Arbeit benötigt wird)
+2

'~' bedeutet nicht "2s Komplement". '~' bedeutet "Bitweises Inversion" – McKay

+0

http://docs.python.org/2/library/operator.html – McKay

+1

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