1


1

圧縮されたバイナリデータの読み取り/書き込み

私は、人々がビット単位でオブジェクトを圧縮することについて話す場所をすべて読みました。 「最初の3ビットはそのようなものを表し、次の2ビットはこれを表し、そのための12ビットを表す」

メモリ使用量を最小限に抑えることが望ましい理由を理解していますが、これを実装する良い方法は考えられません。 私はそれを1つ以上の整数(または長整数)にパックすることを知っていますが、それを扱う簡単な方法を思い描くことはできません。 任意の長さのバイナリフィールドから任意のビットを取得/設定できるクラスがあれば、それはかなりクールであり、それは私のために面倒を見るでしょう、そして私は& 'sと|'でいじり回す必要はありませんsとマスクなど。

この種のものに標準的なパターンはありますか?

4 Answer


3


MSDNから:

_ _ BitArrayクラス

ブール値として表されるビット値のコンパクトな配列を管理します。trueはビットがオン(1)であることを示し、falseはビットがオフ(0)であることを示します。 _ _

例:

BitArray myBitArray = new BitArray(5);
myBitArray[3] = true; // set bit at offset 3 to 1

ただし、BitArrayでは個々のビットのみを設定できます。 より多くのビットで値をエンコードしたい場合は、おそらく&&や| '、マスクなどをいじくり回す方法はないでしょう:-)


1


NET Frameworkのhttp://msdn.microsoft.com/en-us/library/system.collections.specialized.bitvector32.aspx[BitVector32]構造をチェックアウトすることをお勧めします。 int内のビットの範囲である「セクション」を定義し、それらのセクションの値を読み書きできます。

主な制限は、単一の32ビット整数に制限されることです。これは、何をしようとしているかによって、問題になる場合とそうでない場合があります。 dtbで述べたように、BitArrayは任意のサイズのビットフィールドを処理できますが、一度に取得および設定できるビットは1つだけです。BitVector32のようなセクションのサポートはありません。


0


探しているものはビット演算と呼ばれます。

たとえば、整数の最下位24ビットでRGB値を表し、Rがビット23〜16、Gがビット15〜8、Bがビット7〜0であるとします。

次のように他のビットに影響を与えることなく、Rを0〜255の任意の値に設定できます。

void setR(ref int RGBValue, int newR)
{
  int newRValue = newR << 16; // shift it left 16 bits so that the 8 low-bits are now in position 23-16
  RGBValue = RGBValue & 0x00FF; // AND it with 0x00FF so that the top 16 bits are set to zero
  RGBValue = RGBValue | newRValue;   // now OR it with the newR value so that the new value is set.
}

ビット単位のANDおよびORを使用することで(よりエキゾチックな操作も可能)、より大きな値の個々のビットを簡単に設定およびクリアできます。


0


ツールキットやプラットフォーム固有のラッパークラスを使用するよりも、弾丸を噛み、&sと| sと0x04sを学び、すべてのビット演算子がどのように機能するかを学ぶ方が良いと思います。 概して、それがほとんどのプロジェクトで行われている方法であり、操作は非常に高速です。 操作はほとんどの言語でほぼ同じであるため、特定のツールキットに依存することはありません。