3

これは、100 番目の定数が 1 << 100 でなければならないということでしょうか?

4

5 に答える 5

15

設定またはクリアする任意の数のビットを持つ BitSet を使用できます。例えば

BitSet bitSet = new BitSet(101);
bitSet.set(100);
于 2013-02-04T22:08:59.017 に答える
4

ビットマスクとして使用できるプリミティブ数の最大サイズは、実際には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;
}
于 2013-02-04T22:05:09.483 に答える
4

プリミティブ型のビット数を持つ単純なビットマスクのみを作成できます。

(通常の Java のように) 32 ビットの int がある場合、1 << 31 が最下位ビットをシフトできる最大値です。

より大きな定数を使用するには、int 要素の配列を使用し、32 (32 ビット int) で割って使用する配列要素を見つけ、% 32 (モジュラ) で選択した配列要素にシフトします。

于 2013-02-04T22:04:26.700 に答える
2

有効な Java アイテム #32 は、ビット フィールドの代わりにEnumSetを使用することを提案しています。内部的にはビット ベクトルを使用するため効率的ですが、各ビットにはわかりやすい名前 (enum 定数) が付けられているため、読みやすくなっています。

于 2013-02-04T22:48:52.230 に答える
0

はい、これらの定数の一部またはすべてをビットごとに OR できるようにする場合は、各定数を表すビットが必要になります。もちろん、 a を使用するintと 32 ビットしかなく、 alongを使用すると 64 ビットしか得られません。

于 2013-02-04T22:05:28.883 に答える