[Tutor] Dealing with bitfields in Python
Skipper Seabold
jsseabold at gmail.com
Sun Aug 30 19:35:42 CEST 2009
On Sun, Aug 30, 2009 at 1:25 PM, Luke
Paireepinart<rabidpoobear at gmail.com> wrote:
> You can just do a binary AND with your consts and your bitfield value to get
> each bit. The values will be the actual value (2, 4, 8, etc.) but if you
> use these as a boolean it won't matter.
> I.E.
>>>> bitfield = 119
>>>> seek = bitfield & CAN_SEEK
>>>> seek
> 16
>>>> if seek:
> print "Hello"
> Hello
>>>>
> if you have to have these constants defined.
> The way I'd actually do it is probably without defining constants.
> #unpack bitfield values
> go_next, go_prev, pause, play, seek, meta, tracklist = [(1<<i) & bitfield
> for i in range(7)]
> If you need them as booleans for some reason,
> go_next, go_prev, pause, play, seek, meta, tracklist = [((1<<i) & bitfield >
> 0) for i in range(7)]
> If this isn't what you're asking, just clarify what you meant and I'll try
> to help.
> HTH,
> -Luke
No that's perfect. It looks like I need to read up a bit more (pun
not intended) on the binary AND, but I think I see what it does and I
understand your example.
Thanks,
Skipper
> On Sun, Aug 30, 2009 at 5:59 PM, Skipper Seabold <jsseabold at gmail.com>
> wrote:
>>
>> Hello all,
>>
>> Fair warning, I didn't know what a bitfield was a few hours ago.
>>
>> I am working with a program via the dbus module and I am wondering if
>> there is built-in support to deal with bitfields in Python. I query
>> my application and it returns a bitfield 119. The bitfield "key" is
>>
>> NONE = 0,
>> CAN_GO_NEXT = 1 << 0,
>> CAN_GO_PREV = 1 << 1,
>> CAN_PAUSE = 1 << 2,
>> CAN_PLAY = 1 << 3,
>> CAN_SEEK = 1 << 4,
>> CAN_PROVIDE_METADATA = 1 << 5,
>> CAN_HAS_TRACKLIST = 1 << 6
>>
>> And a call to the method returns 119. I have gotten far enough to
>> understand that 119 is
>>
>> >>> (1<<0)+(1<<1)+(1<<2)+(0<<3)+(1<<4)+(1<<5)+(1<<6)
>> 119
>>
>> 119 is 01110111 as a binary byte (I'm reaching back to high school
>> computer science here...)
>>
>> So I guess I understand the basics of what it's telling me, but I'd
>> like to unpack 119 into binary, so I can read it and use the
>> information in my program. I've adapted a code snippet that I found
>> online to do this, but I'm wondering if there is a better way in
>> python maybe using binascii or struct?
>>
>> Here is the helper function I've adapated
>>
>> def int_2_binary(int):
>> const = 0x80000000
>> output = ""
>> ## for each bit
>> for i in range(1,33):
>> ## if the bit is set, print 1
>> if( int & const ):
>> output = output + "1"
>> else:
>> output = output + "0"
>> ## shift the constant using right shift
>> const = const >> 1
>> output = list(output)
>> output = "".join(output[-8:])
>> return output
>>
>> As you can see const is the smallest signed 32-bit integer, and it
>> would return a length 32 string. But I know that my bitfield will be
>> 8-bit, I just don't know what this is in hexadecimal (?) to define
>> const. Any pointers to do this in a better way would be appreciated.
>>
>> Thanks,
>>
>> Skipper
>> _______________________________________________
>> Tutor maillist - Tutor at python.org
>> http://mail.python.org/mailman/listinfo/tutor
>
>
More information about the Tutor
mailing list