2009-12-11 20 views
5

Hey ragazzi, ho avuto un problema speravo che qualcuno potesse aiutarmi a capire!Confronto esadecimale Python

Ho una stringa con un numero esadecimale = '0x00000000' che significa:

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

Tutte le combinazioni con quelle sono possibili. cioè 0x01010000 = apple & orange

Come posso dalla mia stringa determinare quale frutta è? Ho creato un dizionario con tutte le combinazioni e poi confrontato con quello, e funziona! Ma mi sto chiedendo un modo più bello di farlo.

risposta

11

Convertire la stringa in un intero, utilizzando la funzione built-in int() e specificando una base:

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

Ora, si ha un intero livello che rappresenta un bitset. utilizzare &, | e qualsiasi altro operatore bit a bit per testare singoli bit.

>>> 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 

Ora, se avete bisogno di riconvertire la stringa:

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

Si chiama bit a bit Ops, e che si può o valori insieme per risultati combinati. Il test, ((64 | 80) = 80) restituirà true se 64 (apple) è OR in 80 (la somma di tutti i valori OR). http://wiki.python.org/moin/BitwiseOperators e – invert

+0

grazie a KeyboardMonkey per il collegamento. –

+0

Grazie a tutti per le risposte rapide! Leggerò su operatori bit a bit! – heffaklump

2

Si potrebbe prima di tutto convertire la stringa in un intero:

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

allora, è possibile impostare una lista per i frutti:

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

per determing Quali frutti si dispone che sia sufficiente:

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) 

L'output è:

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