1

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

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

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

4

4 に答える 4

3

MSDNから:

BitArray クラス

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

例:

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

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

于 2009-12-07T18:56:17.023 に答える
1

.NET FrameworkのBitVector32構造を確認することをお勧めします。int 内のビットの範囲である「セクション」を定義し、それらのセクションに値を読み書きできます。

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

于 2009-12-07T19:27:22.157 に答える
0

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

于 2009-12-07T19:14:32.777 に答える
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 (場合によってはより特殊な演算) を使用することで、より大きな値の個々のビットを簡単に設定およびクリアできます。

于 2009-12-07T19:00:00.450 に答える