2009年3月12日木曜日

マシな名前無いのかな

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
set_shiftableは、後から読んでわからなかった。set_int or setか。intはlongかもしれんし、C的なintじゃないからなぁ。__int__は、intにcastするためのメソッドで、setはその逆操作だ。shiftableでintじゃ無いものも無いし、実装でもdivmodしてるし。反省。



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]

0 件のコメント: