私は現在、純粋な C で効率的な BitStream を実装するためのさまざまな可能な戦略を研究しています。これは、さまざまなビットベースの圧縮アルゴリズムを実装するために必要です。ただし、このトピックに関する文献はあまり見つけられず、見つけることができる良い例はあまりないようです。
これが私が探しているものです:
- 関数呼び出しを避けるためのマクロベースの実装
- BitStream との間で「n」個のビットを読み書きする関数。
- 一般的なものよりも最適化された、5ビットなどの特定のビット数を読み書きする関数。
私は次のことについて疑問に思っています:
- BitStream で保持する必要がある変数。BYTE ポインター、バイト位置、現在のバイトのビット インデックス、現在のバイトに残っているビット数などがあります。
- 維持する変数の数を減らす方法。変数が多ければ多いほど、更新する必要のある変数も多くなります。
- 単一の読み取り/書き込み操作のコンテキストで、中間/一時変数を最小限に抑える方法。
- 操作を BYTE レベルで行うか、UINT16 レベルまたは UINT32 レベルで行う必要があるか。おそらく、ビットを UINT32 に蓄積し、それがいっぱいになったときにバイトを書き込む (またはフラッシュ操作で書き込みが完了したときに) バイトごとにすべてを行うよりもはるかに高速です。
- できるだけループを避けるにはどうすればよいでしょうか。理想的には、BitStream に書き込むビット数をループすることは絶対に避けるべきです。
これはやり過ぎに見えるかもしれませんが、圧縮に関連する残りのコードが非常に最適化されている場合、BitStream の部分がすべてを台無しにしているように見えます。たとえば、画像圧縮コードで SIMD CPU 命令を使用してエンコード プロセスの一部を最適化するアセンブリ ルーチンを目にすることは珍しくありませんが、最後のステップは BitStream への書き込みです。
アイデア、参照、誰か? ありがとうございました!