-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPyBitField.py
More file actions
50 lines (44 loc) · 1.74 KB
/
PyBitField.py
File metadata and controls
50 lines (44 loc) · 1.74 KB
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
38
39
40
41
42
43
44
45
46
47
48
49
50
class PyBitField:
def __init__(self, size=32):
self.intSize = int(size/32)
if not((size % 32) == 0):
self.intSize = self.intSize + 1
self.intArray = [0] * self.intSize
self.size = size
def __getitem__(self, key):
if not(isinstance(key, int) and (key >= 0) and (key < self.size)):
raise TypeError("Invalid key, size of array is " + str(self.size))
idx = int(key / 32)
sub = key % 32
mask = 1 << sub
result = (self.intArray[idx] & mask) >> sub
return(result)
def __setitem__(self, key, value):
if not(value in [0, 1]):
raise ValueError("Assigned value must be 0 or 1.")
if not(isinstance(key, int) and (key >= 0) and (key < self.size)):
raise TypeError("Invalid key, size of array is " + str(self.size))
idx = int(key / 32)
sub = key % 32
mask = 1 << sub
if (value == 0):
mask = ~mask
self.intArray[idx] = self.intArray[idx] & mask
if (value == 1):
self.intArray[idx] = self.intArray[idx] | mask
def __str__(self):
strRep = ""
for i in range(0,len(self.intArray)-1):
strRep = strRep + "|" + "{:032b}".format(self.intArray[i])[::-1]
extra = self.size % 32
if (extra == 0):
extra = 32
shiftAmt = 32 - extra
formatStr = "{:0" + str(extra) + "b}"
strRep = strRep + "|" + formatStr.format(self.intArray[len(self.intArray)-1])[::-1]
return(strRep+"|")
def diagnostics(self):
print("\tPyBitField")
print("\tSize :\t", self.size)
print("\tintSize:\t", self.intSize)
print(str(self))