java - 大于64位的快速位掩码

问题描述:

对于已知大小但大于64位的位掩码,处理(即,执行所有按位操作)的最有效的数据结构是什么?java - 大于64位的快速位掩码

byte[]BigInteger?还有其他的东西吗?

需要是Java 7的兼容,并且要快(或至少一样快,可以合理地预期,鉴于其大小)之类的东西

if(bitmask & 7 != 0){...} 

bitmask1 |= bitmask2 

等上。

+0

的BigInteger当然可以做到所有这些事情。但是,BigInteger实例是不可变的,所以对它的任何操作都会产生一个新的BigInteger对象。您可能需要尝试确定其性能是否可以接受。 – VGR

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

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; 
} 

或者你使用的BitSet

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

是的,BitSet足够快,并有一些不错的操作。虽然不是_shifting_位。 –

+0

@JoopEggen右移,至少有一个解决方案。 https://*.com/questions/9008150/shifting-a-java-bitset(他们称之为左移,但左移向另一个方向,对我来说)。对于左移,我不会立即看到解决方案,而是扩展“BitSet”并添加一个方法,使存储的值增加一个给定量。你做? – User1291

+0

@ User1291似乎是原始位集的子范围,但未重新索引。如果保持起始索引偏移量,至少有一部分偏移(向左或向右清除)。 –