これは、100 番目の定数が 1 << 100 でなければならないということでしょうか?
5 に答える
設定またはクリアする任意の数のビットを持つ BitSet を使用できます。例えば
BitSet bitSet = new BitSet(101);
bitSet.set(100);
ビットマスクとして使用できるプリミティブ数の最大サイズは、実際にはlong
値の 64 ビットであるため、直接行うことはできません。できることは、ビットマスクを 2 つ以上int
の またはに分割long
し、手動で管理することです。
int[] mask = new int[4];
final int MAX_SHIFT = 32;
void set(int b) {
mask[b / MAX_SHIFT] |= 1 << (b % MAX_SHIFT);
}
boolean isSet(int b) {
return (mask[b / MAX_SHIFT] & (1 << (b % MAX_SHIFT))) != 0;
}
プリミティブ型のビット数を持つ単純なビットマスクのみを作成できます。
(通常の Java のように) 32 ビットの int がある場合、1 << 31 が最下位ビットをシフトできる最大値です。
より大きな定数を使用するには、int 要素の配列を使用し、32 (32 ビット int) で割って使用する配列要素を見つけ、% 32 (モジュラ) で選択した配列要素にシフトします。
有効な Java アイテム #32 は、ビット フィールドの代わりにEnumSetを使用することを提案しています。内部的にはビット ベクトルを使用するため効率的ですが、各ビットにはわかりやすい名前 (enum 定数) が付けられているため、読みやすくなっています。
はい、これらの定数の一部またはすべてをビットごとに OR できるようにする場合は、各定数を表すビットが必要になります。もちろん、 a を使用するint
と 32 ビットしかなく、 along
を使用すると 64 ビットしか得られません。