这是否意味着第100个常数必须是1 <&lt;&lt; 100?
答案 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位。