是否可以使用逻辑运算符移动 Java BitSet?

Is it possible to shift a Java BitSet using the logical operators?

例如我有一个 BitSet BitSet x = new BitSet(32); 并且我设置了第 3 位 x.set(2, true);
是否有像 x << someAmount; 这样用 0 填充的逻辑移位?

这是将它们左右移动 8 位的方法。

BitSet bits = new BitSet();
bits.set(10);
bits.set(30);
System.out.println("unshifted:" + bits);
System.out.println("right shift: " + shift(bits, 8));
System.out.println("left shift: " + shift(bits,-8));

版画

unshifted: {10, 30}
right shift: {18, 38}
left shift: {2, 22}

方法在这里

  • 它流式传输当前位置
  • 并根据偏移量进行调整
  • 由于负偏移而导致的位置将被删除,因为它们会超出范围。
  • 返回新的 BitSet。
    
public static BitSet shift(BitSet bitset, int shiftAmount) {
    BitSet b = new BitSet();
    bitset.stream().map(bitPos -> bitPos + shiftAmount)
            .dropWhile(bitPos -> bitPos < 0)
            .forEach(bitPos -> b.set(bitPos));
    return b;
}

请注意,a BitSet 的方向是从 1,2,4,8 开始,这与正常的二进制数相反。另请注意,在上面左移的位将丢失尾随零。右移将在左侧获得填充的。