ActiveState Code

Recipe 113799: bit field manipulation


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

  1. 1. At 5:23 p.m. on 8 aug 2008, edsall said:

    error in this code:

        mask = 2L**(end - start) -1
    

    should be

        mask = 2L**(end - start + 1) -1
    
  2. 2. At 12:13 p.m. on 26 sep 2008, dan said:

    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