On Sun, Aug 30, 2009 at 1:25 PM, Luke Paireepinart<[email protected]> 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 <[email protected]> > 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 - [email protected] >> http://mail.python.org/mailman/listinfo/tutor > > _______________________________________________ Tutor maillist - [email protected] http://mail.python.org/mailman/listinfo/tutor
