2009-12-11 13 views
5

Hej, mam problem, miałem nadzieję, że ktoś może mi pomóc wymyślić!Python porównanie heksadecymalne

Mam ciąg z numerem szesnastkowym = '0x00000000' co oznacza: czy możliwe

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

Wszystkie kombinacje z nich. tj., 0x01010000 = apple & orange

W jaki sposób z mojego napisu mogę określić, jaki to jest owoc? Zrobiłem słownik ze wszystkimi kombinacjami, a następnie porównując to i działa! Ale zastanawiam się nad lepszym sposobem na zrobienie tego.

Odpowiedz

11

Konwersja ciąg do liczby całkowitej, za pomocą wbudowanej funkcji int() i określenie podstawy:

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

Teraz masz standardową liczbę całkowitą reprezentującą bitset. użyj &, | i dowolnego innego operatora bitowego do testowania poszczególnych bitów.

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

Teraz, jeśli chcesz przekonwertować z powrotem do napisu:

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

Nazywa Ops bitowe, i może lub wartości razem dla połączonych wyników ty. Test ((64 | 80) = 80) zwróci wartość true, jeśli 64 (jabłko) ma wartość OR równą 80 (suma wszystkich wartości OR). http://wiki.python.org/moin/BitwiseOperators i – invert

+0

dzięki KeyboardMonkey dla łącza. –

+0

Dziękuję wszystkim za szybkie odpowiedzi! Przeczytam operatory bitowe! – heffaklump

2

Można najpierw przekonwertować ciąg do liczby całkowitej:

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

następnie, można ustawić listę owoców:

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

za określanie jakie owoce masz to wystarczy:

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) 

Wyjście tutaj jest:

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