tags:

views:

124

answers:

3

Hey guys, I got a problem I was hoping someone could help me figure out!

I have a string with a hexadecimal number = '0x00000000' which means:

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

All combinations with those are possible. i.e., 0x01010000 = apple & orange

How can I from my string determine what fruit it is? I made a dictionary with all the combinations and then comparing to that, and it works! But I am wondering about a nicer way of doing it.

+6  A: 

convert your string to an integer, by using the int() built-in function and specifying a base:

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

now you have a standard integer representing a bitset. use &, | and any other bitwise operator to test individual bits.

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

now, if you need to convert back to your string:

>>> hex(value)
'0x1000100'
Adrien Plisson
It's called Bitwise Ops, and you can OR values together for combined results. The test, ((64|80) = 80) will return true if 64 (apple) is OR'ed into 80 (the sum of all OR values). http://wiki.python.org/moin/BitwiseOperators and
Wez
thanks KeyboardMonkey for the link.
Adrien Plisson
Thanks all for quick answers! I will read up on bitwise operators!
heffaklump
+2  A: 

You could first of all convert your string to an integer:

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

then, you could set up a list for the fruits:

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

for determing what fruits you have that is enough:

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)

The output here is:

The fruit 'apple' is contained in '0x01010000'
The fruit 'orange' is contained in '0x01010000'
Johannes Weiß
A: 
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))
David Sykes