0

特定のインデックスを一連のビットに格納したいと考えています。ビット数は
2 のべき乗であり、最大インデックスは 255 (開始インデックスは 0) であると想定しても安全です。以前は、すべてのインデックスを整数として格納していました。しかし、それはあまりにも多くのメモリを占有します。

マスクのようなものを使いたい。

例: インデックス 0、3、5 を格納する場合は、101001、つまり 41 を整数として格納します。

問題は、私が持っている最大インデックスが255であり、上記の手法を使用すると、インデックスを64までしか格納できないことです(64ビット整数を使用)。これを行うことができる他の方法はありますか??

ありがとう :-)

4

3 に答える 3

1

.NET には、この種の組み込みクラスがあります。BitArray

これにより、ビットの文字列 (ブール値の形式) を効率的に格納できます。

、、、およびメソッドを使用BitArrayして、 sに対してビット演算を実行できます。AndOrXorNot

BitArraybool、bytes、または int でa を初期化できます。たとえば、次の00101100ように初期化できます。

BitArray bits = new BitArray(new byte[] { 0x2C }); // 0x2C == 00101100
于 2012-06-16T14:07:23.527 に答える
0

Javaでは、次の小さなチュートリアルのようにビットインデックス作成が簡単になりました...

このクラスは、必要に応じて増加するビットのベクトルを実装します。ビット セットの各コンポーネントにはブール値があります。BitSet のビットは、負でない整数によってインデックス付けされます。個々のインデックス付きビットは、検査、設定、またはクリアできます。1 つの BitSet を使用して、論理 AND、論理包含 OR、および論理排他 OR 操作を介して、別の BitSet の内容を変更できます。

デフォルトでは、セット内のすべてのビットの初期値は false です。

すべてのビット セットには現在のサイズがあります。これは、ビット セットによって現在使用されているスペースのビット数です。サイズはビット セットの実装に関連するため、実装によって変わる可能性があることに注意してください。ビット セットの長さは、ビット セットの論理長に関連し、実装とは別に定義されます。

特に明記されていない限り、BitSet のいずれかのメソッドに null パラメーターを渡すと、NullPointerException が発生します。BitSet は、外部同期なしでマルチスレッドで使用するのは安全ではありません。

于 2012-06-16T13:46:32.430 に答える
0

すべてのビット インデックスに 2 つのビット インデックスを使用できます。実際には 10 ビット (1 から 10 までのインデックス、ビット 0、4、8 を設定):

単一インデックス:

i = 0100010001
Index1 = i

2 つの複合インデックス:

i1 = 01000
i2 = 10001
Index2 = [i1, i2];
Index2.fragment_length = 5

Array 擬似コードでは、ビットを取得または設定します

set(Index, bit) {
    fragment = quotient(bit, Index.flagment_length); //quotient = integer division
    bit_index = module(bit, Index.flagment_length); //index of the bit in the fragment
    set(Index[fragment], bit-or(Index[Fragment], bit-shift-left(1 << bit_index))); //Set the bit indexes vector fragment with or-ing the appropriate bitmask
}

get(Index, bit) {
    fragment = quotient(bit, Index.flagment_length); //quotient = integer division
    bit_index = module(bit, Index.flagment_length); //index of the bit in the fragment
    if (get(Index[fragment], bit-and(Index[Fragment], bit-shift-left(1 << bit_index))) > 0) then true else false; //Get the bit indexes vector fragment bit with and-ing the appropriate bitmask and return true or false
}

私はあなたの要件を理解したことを願っています!

于 2012-06-16T13:40:16.130 に答える