これは私の宿題や仕事を完了するための質問ではないことを強調したいと思います:githubで誰かのコードを読んでgifファイル圧縮のLZWアルゴリズムを勉強していて、ここでブロック:短いPythonコードを理解する助けが必要
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
私が理解できないことは機能encode_bits()
でfor
ループされています。ここでは
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()
は、(必要であれば左側のパディングゼロ)長size
のバイナリ文字列に入力された整数num
をオンにし、文字列を逆にし、一つbitstream
一つに数字を追加します。したがって 仮定するs=DataBlock()
、次いでs.encode_bits(3, 3)
まずと110
に逆、次いで110
self.bitstream
に追加(それは長さ3作るために左にゼロをパディング)011
に3を回すことになる、したがって結果はbytearray('110').
ことしかしべきIコードを実行するように結果はbytearray(b'\x03')
となりますが、期待どおりになりません。さらに、\x03
は3バイトではなく、1バイトであり、彼のコメントと競合し、私はなぜ理解できないのですか?
彼のコードが実行され、正しい出力が得られることを追加するのを忘れてしまったので、私の理解には何か間違いがあります。
それがビットを満たしますビットストリームの右端から最後のバイトに移動します。 –
@ IgnacioVazquez-Abrams:コードがビットストリームの最後のバイトのビットだけを変更することを意味しますか? 'for'ループの最初の' if'は0(1バイト)を付加します... –
self.bitstream(ビット単位)の長さがself.posより小さい場合は、0バイトしか付加しません。どのようにself.bitstreamが必要に応じて一度に1バイトずつ増加するか。 – cco