-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbitUtils.py
62 lines (44 loc) · 1.27 KB
/
bitUtils.py
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
51
52
53
54
55
56
57
58
59
60
61
62
from bitarray import bitarray
import numpy as np
# MRG TODO: assertions on input/output of all of these
def baToInt(ba):
assert ba.length() <= 32, "too long! Tee hee hee."
i = 0
for n, bit in enumerate(ba):
if not bit:
continue
i += 2 ** n
return i
def intToBA(integer, nbits):
ba = bitarray()
for x in range(nbits):
ba.append(((integer >> x) & 1) == 1)
return ba
def intToBA5(integer):
return intToBA(integer, 5)
def intToBA3(integer):
return intToBA(integer, 3)
# Grab N bits
def unpackBits(werd, start=0, stop=18, reverse=False):
# Unpack and trim bits
ba = bitarray(0)
ba.fromstring(werd.tostring())
ba = ba[start:stop]
# Reverse the bits if requested
if reverse:
ba = ba[::-1]
# Pad it to 32 bits
ba = bitarray(32 - len(ba)) + ba
# Convert back to a uint32
return np.fromstring(ba.tobytes(), dtype=np.uint32)
# Random utility functions
def truncateToWord(werd):
return unpackBits(werd, 0, 18)
def getBitAsBool(werd, bitNum):
ba = bitarray(0)
ba.frombytes(werd.tostring())
return ba[bitNum]
def setBit(integer, bitNum, state):
# Nuke that bit to 0
bitMask = 2 ** bitNum
integer[:] = (integer[:] & ~bitMask) | (bitMask * state)