是否可以为~100个常量创建一个位掩码?

时间:2013-02-04 22:01:11

标签: java primitive-types bitmask

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

5 个答案:

答案 0 :(得分:15)

您可以使用具有您想要设置或清除的任何数字位的BitSet。 e.g。

BitSet bitSet = new BitSet(101);
bitSet.set(100);

答案 1 :(得分:4)

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

如果你有32位(如普通Java)int,则1&lt;&lt; 31是你可以移动低位的最多。

要使用更大的常量,可以使用int元素数组,并通过除以32(使用32位int)并使用%32(modula)移位到所选数组元素中来确定要使用的数组元素。

答案 2 :(得分: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;
}

答案 3 :(得分:2)

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

答案 4 :(得分:0)

是的,如果您打算能够将这些常量中的任何或所有常数按位或按位,那么您将需要一个代表每个常量的位。当然,如果你使用int,你将只有32位而long只能给你64位。