2016-10-07 9 views
1

これは私の宿題や仕事を完了するための質問ではないことを強調したいと思います: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に逆、次いで110self.bitstreamに追加(それは長さ3作るために左にゼロをパディング)011に3を回すことになる、したがって結果はbytearray('110').ことしかしべきIコードを実行するように結果はbytearray(b'\x03')となりますが、期待どおりになりません。さらに、\x03は3バイトではなく、1バイトであり、彼のコメントと競合し、私はなぜ理解できないのですか?

彼のコードが実行され、正しい出力が得られることを追加するのを忘れてしまったので、私の理解には何か間違いがあります。

+1

それがビットを満たしますビットストリームの右端から最後のバイトに移動します。 –

+0

@ IgnacioVazquez-Abrams:コードがビットストリームの最後のバイトのビットだけを変更することを意味しますか? 'for'ループの最初の' if'は0(1バイト)を付加します... –

+0

self.bitstream(ビット単位)の長さがself.posより小さい場合は、0バイトしか付加しません。どのようにself.bitstreamが必要に応じて一度に1バイトずつ増加するか。 – cco

答えて

0

はそれをこの方法を探してみてください。

  • あなたが(一瞬xそれを呼び出す)bytearrayオブジェクトが与えられます。
  • オブジェクトには何バイトありますか? (明らかに、それはちょうどlen(x)です。)
  • ビットはいくつですか? xbytearray(b'')である、つまり、あなたは、私たちがなし(ゼロ)で開始したとしていることやったら

xのバイト;(答えを計算してください。これは運動です)。何回バイトを追加する必要がありますか?ビットを3つ保存するには(x.append(...))を追加する必要がありますか?もし8ビットを保存したいのであれば?もし10ビットを保存したいのであれば?

これもやはり練習問題です。答えを計算し、あなたは啓発されるべきです。

(なお、この技術は、いくつかのより大きな空間にサブオブジェクトのいくつかの数を圧縮する、パッキングと呼ばれている。数学の問題generalizedあり、コンピュータでは、often more limitedである。)

+0

ありがとう、私は今それを理解すると思う –

関連する問題