2011-12-30 10 views
0

重要な点は、次の問題で発生する可能性がある点です。ダイナミックビットフィールドの実装

- intの配列の要素は、5,5,6,7,9ビットと言います(それらは異なります)。

通常の160ビットの代わりに32ビットを使用するように、どのようにエンコードできますか?

また、反対側(デコード側)では、各要素の大きさがわかりません。だから、もし私がそのようなデータを受け取ったら、どうすればデコードすることができますか?つまり、最初は簡単にデコードできる方法でどのようにエンコードできますか?

+0

また、文脈や問題点について説明している場合は、こちらを適用して、より役立つ回答を得ることができます。 –

+0

私は適切な答えのための時間がありませんが、これは十分に研究された問題です。 Googleを介した「ユニバーサルコード」を参照してください。 – Kaganar

答えて

0

エレメントの最大サイズに応じて、エレメントのビット数を含む各エレメントの前に4-6ビットを含めることができます(最大サイズが<の場合は4、最大サイズの場合は5、最大サイズ< 64)。

復号が同じくらい簡単になります:

  • 素子として素子サイズを
  • 読み出しXビットを決定するために4ビットを読み出すための変数の

(xは素子サイズです)各要素に何らかの種類のサイズインジケータを含める必要があるため、データを32バイトにパックすることはできません。この場合、サイズに4ビットを使用していると仮定すると、元の160ビットサイズの32.5%にすぎない52ビットを使用します。

2

それらの番号の中のビットの分布が予め分かっている場合、それは簡単です:ちょうどこの(例えば、C++コードで)のように、得られたINTにおける適切な位置にアレイ内の各要素のビットを置く:

unsigned int encoded = (val[0]) | (val[1] << 5) | (val[2] << 10) | 
       (val[3] << 16) | (val[4] << 23); 

... valがintの配列であり、5,5,6,7,9ビットの長さの数値を含んでいるとします。ビット長が予め知られていない場合

int decoded[5]; 
decoded[0] = encoded & 0x1F; 
decoded[1] = (encoded >> 5) & 0x1F; 
decoded[2] = (encoded >> 10) & 0x3F; 
decoded[3] = (encoded >> 16) & 0x7F; 
decoded[4] = (encoded >> 23); 

、唯一知られた事実は、その後、一般的なケースのためが、それはエンコードに不可能だ、それらのビットサイズ組み合わせが32であること、である。復号化は同様に簡単ですそれらを最大32ビットに変換します。実際の数値を格納するにはすでにこの量のビットが必要です。あなたはまた、コード化された数字のビット長を知る必要があります。このためには追加のストレージが必要です。これらの数字は何らかの形で冗長でなく圧縮されていれば、すべて有効です。

整数を4バイト未満にする方法はもちろんありますが、作業する数値の正確な特性に応じて、一方または他方のアルゴリズムがより適している可能性があります。可能なアルゴリズムの簡単なリストを次に示します。

  • 整数が最大9ビットであることがわかっている場合は、上記の単純な方法を使用できますが、9のオフセットを使用して数値を格納します;このメソッドでは、5つの値に対して45ビットになります。
  • 各要素の前に長さインジケータを有することは別の可能性である(Robert Rouhaniによって示唆されるように)
  • もう1つが可能です。あなたはまた、Variable-length quantityを使用することができ
  • this questionで提案されている(Dlugosz' Variable-Length-Integerを使用)。

最初の2つの方法は固定された最大数のビットしか表現できないという欠点があります。この種の処理はの圧縮の領域に分類されます。より理論的な分析のためには、そのトピックに関するいくつかの文献を必ず読んでください。 Kaganarのコメントで指摘されているように、ここで特に興味のあるものはUniversal Codesです。上のリストの最後の2つのアルゴリズムはそのようなユニバーサルコードです。 5,5,6,7および9ビット(8ビット未満の4つの値の場合は4倍の8ビット、9ビットの場合は1つの時間の16ビット)の5つの値の入力例では、数)。リスト上の他の方法に対するこれらの2つの方法の利点は、任意に大きいのに適していることです。番号;あなたの目的に合った他のUniverslコードがあるかもしれませんが、他のUniverslコードもチェックしてください。

0

私は5,5,6,7,9を32ビットに圧縮することは不可能だと思います。すべての情報に合うようにストレージが小さすぎます。

まず、要素の可能な最大ビットを観察することによって、パディングビットを最小限に抑えることができます。最大10ビット要素に32ビット変数を使用すると、22ビットが無駄になります。 10ビットのデータ型で各要素ごとに22ビットを取り除くことができます。

これ以外のものは膨らんだり、収縮計画が必要ですが、OPの例のように小さなデータや数値配列にはうまく収まらないと思います。