有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

位操作如何在位集JAVA中左右移动位?

我有一个10万比特的比特集。我想尽可能高效地将其向右和向左移动。我猜BitSet类中没有移位位的函数,所以我尝试使用toLongArray()将它们转换为长数组,但正如预期的那样,它会产生溢出

我找到的一个临时解决方案是将位集转换为BigInteger,然后将BigInteger移位,然后将BigInteger转换回位集,但这非常缓慢

所以我的问题是:

  1. 有没有更好的方法来移位一个位集(移位我指的是左移位和右移位)
  2. 当我将位数大于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) 个答案