2009-12-11 3 views
5

Hé les gars, j'ai eu un problème j'espérais que quelqu'un pourrait m'aider à comprendre!Python comparaison hexadécimale

J'ai une chaîne avec un nombre hexadécimal = '0x00000000' qui signifie:

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

Toutes les combinaisons sont possibles avec ceux. c'est-à-dire 0x01010000 = apple & orange

Comment puis-je déterminer à partir de ma chaîne de quel fruit il s'agit? J'ai fait un dictionnaire avec toutes les combinaisons et ensuite comparer à cela, et ça marche! Mais je m'interroge sur une meilleure façon de le faire.

Répondre

11

Convertissez votre chaîne à un entier, en utilisant la int() fonction intégrée et en spécifiant une base:

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

Maintenant, vous avez un nombre entier représentant une norme bitset. utilisez &, | et tout autre opérateur au niveau du bit pour tester des bits individuels.

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

Maintenant, si vous avez besoin de convertir à votre chaîne:

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

Il est appelé Ops au niveau du bit, et vous pouvez ou les valeurs ainsi pour les résultats combinés. Le test, ((64 | 80) = 80) retournera vrai si 64 (apple) est OR dans 80 (la somme de toutes les valeurs OR). http://wiki.python.org/moin/BitwiseOperators et – invert

+0

merci KeyboardMonkey pour le lien. –

+0

Merci à tous pour vos réponses rapides! Je vais lire sur les opérateurs au niveau du bit! – heffaklump

2

Vous pouvez d'abord convertir votre chaîne en entier:

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

alors, vous pouvez définir une liste pour les fruits:

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

pour DETERMINATION quels fruits vous avez cela suffit:

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) 

La sortie est ici:

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