2009-12-11 5 views
5

Hey Leute, ich habe ein Problem Ich hoffte, jemand könnte mir helfen herauszufinden!Python hexadezimaler Vergleich

Ich habe einen String mit einer hexadezimalen Zahl = '0x00000000' was bedeutet:

0x01000000 = apple 
0x00010000 = orange 
0x00000100 = banana 

Alle Kombinationen mit denen möglich sind. d. h., 0x01010000 = apple & orange

Wie kann ich von meinem String feststellen, welche Frucht es ist? Ich habe ein Wörterbuch mit allen Kombinationen erstellt und dann verglichen, und es funktioniert! Aber ich wundere mich über eine schönere Art, es zu tun.

Antwort

11

Konvertieren Sie Ihre Zeichenfolge in eine ganze Zahl ist, unter Verwendung der int() eingebaute Funktion und die Angabe einer Basis:

>>> int('0x01010000',16) 
16842752 

Jetzt haben Sie eine Standard ganze Zahl mit einem bitset darstellt. Verwenden Sie &, | und jeden anderen bitweisen Operator, um einzelne Bits zu testen.

>>> value = int('0x01010000',16) 
>>> apple = 0x01000000 
>>> orange = 0x00010000 
>>> banana = 0x00000100 
>>> bool(value & apple) # tests if apple is part of the value 
True 
>>> value |= banana  # adds the banana flag to the value 
>>> value &= ~orange # removes the orange flag from the value 

Nun, wenn Sie zurück in Ihre Zeichenfolge konvertieren müssen:

>>> hex(value) 
'0x1000100' 
+0

Es Bitwise Ops genannt, und Sie können oder gemeinsam Werte für den kombinierten Ergebnissen. Der Test, ((64 | 80) = 80) gibt wahr zurück, wenn 64 (Apfel) in eine ODER-Verknüpfung mit 80 (die Summe aller OR-Werte) gesetzt wird. http://wiki.python.org/moin/BitwiseOperators und – invert

+0

danke KeyboardMonkey für den Link. –

+0

Vielen Dank für schnelle Antworten! Ich werde über bitweise Operatoren nachlesen! – heffaklump

2

könnten Sie zunächst einmal konvertieren Sie Ihre String in einen Integer:

s = "0x01010000" 
i = int(s, 16) #i = 269484032 

dann könnten Sie setzen eine Liste für die Früchte:

fruits = [(0x01000000, "apple"), (0x00010000, "orange"), (0x00000100, "banana")] 

für determing was Früchte Sie haben, ist genug:

s = "0x01010000" 
i = int(s, 16) 
for fid,fname in fruits: 
    if i&fid>0: 
     print "The fruit '%s' is contained in '%s'" % (fname, s) 

Der Ausgang ist hier:

The fruit 'apple' is contained in '0x01010000' 
The fruit 'orange' is contained in '0x01010000' 
0
def WhichFruit(n): 
    if n & int('0x01000000',16): 
     print 'apple' 
    if n & int('0x00010000',16): 
     print 'orange' 
    if n & int('0x00000100',16): 
     print 'banana' 

WhichFruit(int('0x01010000',16))