位操作如何在位集JAVA中左右移动位?
我有一个10万比特的比特集。我想尽可能高效地将其向右和向左移动。我猜BitSet类中没有移位位的函数,所以我尝试使用toLongArray()
将它们转换为长数组,但正如预期的那样,它会产生溢出
我找到的一个临时解决方案是将位集转换为BigInteger,然后将BigInteger移位,然后将BigInteger转换回位集,但这非常缓慢
所以我的问题是:
- 有没有更好的方法来移位一个位集(移位我指的是左移位和右移位)
- 当我将位数大于64的位集转换为长数组时,数组中会出现负数。当比特集只能表示1个数的比特时,为什么首先要有一个函数
toLongArray()
。如果我错了,请纠正我李>
下面是使用BigInteger的代码
public static BitSet toBitSet(BigInteger val) {
if(val.signum() < 0)
throw new IllegalArgumentException("Negative value: " + val);
return BitSet.valueOf(reverse(val.toByteArray()));
}
static byte[] reverse(byte[] bytes) {
for(int i = 0; i < bytes.length/2; i++) {
byte temp = bytes[i];
bytes[i] = bytes[bytes.length-i-1];
bytes[bytes.length-i-1] = temp;
}
return bytes;
}
public static BigInteger toBigInteger(BitSet val) {
return new BigInteger(1, reverse(val.toByteArray()));
}
public static BitSet shiftLeft(BitSet bits, int n) {
BigInteger temp= toBigInteger(bits);
temp= temp.shiftLeft(n);
return toBitSet(temp);
}
PS:我找到的所有答案都是关于位数的<;=64
共 (0) 个答案