2012-11-21 12 views
9

Gibt es eine einfache Möglichkeit, ein eigenes Komplement in Python zu erzeugen? Wenn Sie zum Beispiel den Hexadezimalwert 0x9E nehmen, muss ich ihn in umwandeln.Vom hexadezimalen zum eigenen Komplement in Python

Ich muss die binären 1 für 0 und 0 für 1 austauschen. Es fühlt sich so an, als ob das einfach wäre.

Antwort

23

Nur the XOR operator ^ gegen 0xFF verwenden:

>>> value = 0x9E 
>>> mask = (1 << value.bit_length()) - 1 
>>> hex(value^mask) 
'0x61' 
>>> value = 0x9E9E 
>>> mask = (1 << value.bit_length()) - 1 
>>> hex(value^mask) 
'0x6161' 
+0

OK Ich bin verwirrt, warum ist '~ x' falsch? Es sollte schließlich der binäre Negationsoperator sein. Ich kann meine Meinung nicht über den Mangel an signierten/unsignierten Unterschied, wenn binäre Ops betroffen sind – Kos

+1

@Kos: '~' gibt buchstäblich '- (x + 1)', was ist großartig, wenn es um signierte Werte handelt. So ist ~ ~ 0x9E' '-159' oder' -0x9f' hex. Für nicht signiertes bitweises Arbeiten, nicht so toll. –

+0

OK Ich habe das, Pythons "konzeptionell unendliche Folge von' 1's vor negativen Zahlen "Ansatz hat mit meinem Kopf verwirrt. Analogies zu C bitweise Ops funktionieren hier nicht :( – Kos

1

Hah:

>>> hex(0x9E^0xFF) 
'0x61' 

Wenn Sie mit Werten größer als ein Byte arbeiten, können Sie die Maske aus dem int.bit_length() method auf Ihrem Wert schaffen könnte. gerade herausgefunden, dass Python bin() eine Zeichenfolge zurückgeben!

so können wir etwas Spaß dabei haben!

for x in numbers: # numbers is a list of int 
    b = bin(x) 
    #print b # e.g. String 0b1011100101 
    b = b.replace('0', 'x') 
    b = b.replace('1', '0') 
    b = b.replace('x', '1') 
    b = b.replace('1b', '0b') 
    #print b # String 0b0100011010 
    print int(b, 2) # the decimal representation 
Verwandte Themen