class BitArray(object):
strcut_fmt = '!B'
def __init__(self, size, binary=None, endian=None):
self.size = size
if binary:
if len(binary) > byte_length(size):
raise ValueError('spilling data, %i byte is too long for array size %i bits !'
%(len(binary), size))
self.binary = binary
else:
self.binary = '\x00'*byte_length(self.size)
if endian:
self.endian = endian
else:
self.endian = '<' # little endian
def __len__(self):
return self.size
def __int__(self):
ret = 0
mask = 1
for bit in self:
if bit:
ret |= mask
mask = mask << 1
return ret
def set_shiftable(self, value, begin, end):
d = value
for n in range(begin, end):
d, m = divmod(d, 2)
self[n] = m
def _getbyte(self, pos_of_byte):
return struct.unpack(self.strcut_fmt, self.binary[pos_of_byte])[0]
def _setbyte(self, pos_of_byte, value):
self.binary = (self.binary[:pos_of_byte]
+ struct.pack(self.strcut_fmt, value)
+ self.binary[pos_of_byte+1:]
)[:self.size]
def __iter__(self):
for i in range(self.size):
yield self[i]
2009年3月12日木曜日
マシな名前無いのかな
set_shiftableは、後から読んでわからなかった。set_int or setか。intはlongかもしれんし、C的なintじゃないからなぁ。__int__は、intにcastするためのメソッドで、setはその逆操作だ。shiftableでintじゃ無いものも無いし、実装でもdivmodしてるし。反省。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿