[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