List like protocol for bit field manipulation
| Python |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #
# bitfield manipulation
#
class bf(object):
def __init__(self,value=0):
self._d = value
def __getitem__(self, index):
return (self._d >> index) & 1
def __setitem__(self,index,value):
value = (value&1L)<<index
mask = (1L)<<index
self._d = (self._d & ~mask) | value
def __getslice__(self, start, end):
mask = 2L**(end - start) -1
return (self._d >> start) & mask
def __setslice__(self, start, end, value):
mask = 2L**(end - start) -1
value = (value & mask) << start
mask = mask << start
self._d = (self._d & ~mask) | value
return (self._d >> start) & mask
def __int__(self):
return self._d
k = bf()
k[3:7]=5
print k[3]
print k[5]
k[7]=1
print k[4:8]
print int(k)
|
Discussion
This class allow you to access the individuals bits of a number with a protocol similar to list indexing and slicing.
Since the class doesn't provide a __len__ method, calls like: k[-1] of k[2:] wont work.


Comments
error in this code:
should be
Actually modifying the code that way breaks the python list conventions; asking for
k[4:8]should give the 4th, 5th, 6th and 7th elements, but not the 8th.Sign in to comment