Java 是否可以为大约100个常量创建位掩码?

Java 是否可以为大约100个常量创建位掩码?,java,primitive-types,bitmask,Java,Primitive Types,Bitmask,这是否意味着第100个常量必须为1您只能创建一个简单的位掩码,其中包含基元类型中的位数 如果您有一个32位的int(就像在普通Java中一样),那么1就不能直接执行,因为对于long值,可以用作位掩码的基元数的最大大小实际上是64位。您可以将位掩码拆分为2个或多个ints或longs,然后手动管理 int[] mask = new int[4]; final int MAX_SHIFT = 32; void set(int b) { mask[b / MAX_SHIFT] |= 1 <

这是否意味着第100个常量必须为1您只能创建一个简单的位掩码,其中包含基元类型中的位数


如果您有一个32位的int(就像在普通Java中一样),那么1就不能直接执行,因为对于
long
值,可以用作位掩码的基元数的最大大小实际上是64位。您可以将位掩码拆分为2个或多个
int
s或
long
s,然后手动管理

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;
}
int[]掩码=新的int[4];
最终整数最大移位=32;
无效集(int b){

遮罩[最大/最大偏移]|=1是的,如果你想按位或任何或所有这些常量一起计算,那么你需要一个位来表示每个常量。当然,如果你使用
int
你将只有32位,而
long
只会给你64位。

你可以使用一个位集,它有你想要设置或清除的任何位数r、 例如

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

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

long
(Java中最大的整数原语)只有64位。因此,否:没有一个原语值。除非奇迹出现并将div和mod优化为右移/按位and…否则与上述操作相比,成本将相当高。div/mod是CPU最昂贵的操作之一,不涉及总线/一致性/缓存未命中。