我想强调的是,这不是要求完成我的作业或工作:我正在研究用于gif文件压缩的LZW算法,通过阅读github上的某些人的代码,并且被一个混淆了代码块在这里:
class DataBlock(object):
def __init__ (self):
self.bitstream = bytearray()
self.pos = 0
def encode_bits (self, num, size):
"""
Given a number *num* and a length in bits *size*, encode *num*
as a *size* length bitstring at the current position in the bitstream.
"""
string = bin(num)[2:]
string = '0'*(size - len(string)) + string
for digit in reversed(string):
if len(self.bitstream) * 8 <= self.pos:
self.bitstream.append(0)
if digit == '1':
self.bitstream[-1] |= 1 << self.pos % 8
self.pos += 1
我无法理解的是函数for
中的encode_bits()
循环:
for digit in reversed(string):
if len(self.bitstream) * 8 <= self.pos:
self.bitstream.append(0)
if digit == '1':
self.bitstream[-1] |= 1 << self.pos % 8
self.pos += 1
这是我的猜测(取决于他的评论):
函数encode_bits()
将输入整数num
转换为长度为size
的二进制字符串(如果需要,在左边填充零)并反转字符串,并将数字追加到{ {1}}一个接一个。于是
假设bitstream
,然后s=DataBlock()
首先将3转换为s.encode_bits(3, 3)
(在左边填充零以使其长度为3)并将其反转为011
,然后追加{{} 1}}到110
,因此结果应该是110
但是当我运行代码时,结果会给出self.bitstream
,而不是预期的。更进一步,bytearray('110').
是一个字节,而不是3位,与他的评论冲突,我不明白为什么?
我忘了添加他的代码运行并提供正确的输出,因此我的理解有些不对。
答案 0 :(得分:0)
尝试以这种方式看待它:
bytearray
个对象(暂时称之为x
)。len(x)
。)完成后,假设我们在x
中没有(零)字节开头,即x
是bytearray(b'')
。为了存储三个位,我们需要添加多少个字节(x.append(...)
)?如果我们想存储8位怎么办?如果我们想存储十位怎么办?
同样,这些都是练习。计算答案,你应该开悟。
(顺便提一下,这种将一些子对象压缩到更大空间的技术称为打包。在数学中问题是generalized,而在计算机中它是often more limited。 {3}}。)