3

这是否意味着第 100 个常数必须是 1 << 100?

4

5 回答 5

15

您可以使用一个 BitSet,它具有您想要设置或清除的任意数量的位。例如

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

您只能使用原始类型中的位数创建一个简单的位掩码。

如果您有一个 32 位(如在普通 Java 中)int,那么 1 << 31 是您可以移动低位的最大值。

要获得更大的常数,您可以使用一个 int 元素数组,然后通过除以 32(使用 32 位 int)并使用 % 32(模数)移动到选定的数组元素中来确定要使用的数组元素。

于 2013-02-04T22:04:26.700 回答
4

您不能直接这样做,因为可用作位掩码的原始数字的最大大小实际上是一个long值的 64 位。您可以做的是将位掩码拆分为 2 个或多个ints 或longs,然后手动管理它。

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 回答
2

Effective Java Item #32 建议使用EnumSet而不是位字段。在内部,它使用位向量,因此效率很高,但是,由于每个位都有一个描述性名称(枚举常量),因此它变得更具可读性。

于 2013-02-04T22:48:52.230 回答
0

是的,如果您打算将任何或所有这些常量按位或全部放在一起,那么您将需要一个位来表示每个常量。当然,如果你使用 anint你将只有 32 位,而 along只会给你 64 位。

于 2013-02-04T22:05:28.883 回答