移位 Java 位集

2022-09-01 18:40:02

我正在使用a来存储位的密集向量。java.util.BitSet

我想实现一个将位向右移1的操作,类似于在int上。>>>

是否有移位 s 的库函数?BitSet

如果没有,有没有比下面更好的方法?

public static void logicalRightShift(BitSet bs) {
  for (int i = 0; (i = bs.nextSetBit(i)) >= 0;) {
    // i is the first bit in a run of set bits.

    // Set any bit to the left of the run.
    if (i != 0) { bs.set(i - 1); }

    // Now i is the index of the bit after the end of the run.
    i = bs.nextClearBit(i);  // nextClearBit never returns -1.
    // Clear the last bit of the run.
    bs.clear(i - 1);

    // 0000111100000...
    //     a   b
    // i starts off the loop at a, and ends the loop at b.
    // The mutations change the run to
    // 0001111000000...
  }
}

答案 1

这应该可以解决问题:

BitSet shifted = bs.get(1, bs.length());

它会给你一个与原始位相等的位集,但没有最低的位。

编辑:

要将其推广到位,n

BitSet shifted = bs.get(n, Math.max(n, bs.length()));

答案 2

另一种可能更有效的替代方法是使用底层的 long[]。

用于获取基础数据。相应地移动这些多头,然后通过创建一个新的 BitSet,您必须非常小心地移动底层多头,因为您必须在数组中的下一个多头上取低阶位并将其移入高阶位。bitset.toLongArray()BitSet.valueOf(long[])

这应该允许您使用处理器上本机的位移位操作一次移动 64 位,而不是单独迭代每个位。

编辑:基于路易斯·瓦瑟曼的评论。这仅在 Java 1.7 API 中可用。当我写它时没有意识到这一点。


推荐