能否使用逻辑运算符对Java BitSet执行逻辑移位操作?
关于Java BitSet实现逻辑左移的解答
结论
可以实现,Java标准库的java.util.BitSet没有内置移位方法,但可以通过简单的自定义逻辑实现符合要求的逻辑左移,移位后低位自动补0。
实现思路
逻辑左移N位的核心规则是:原有所有置为true的位的索引统一增加N,低于N的低位天然全部为0,完全符合空位补0的要求。
代码实现
通用实现(返回新实例,不修改原对象)
import java.util.BitSet; // Java 8及以上版本实现 public static BitSet logicLeftShift(BitSet original, int shiftAmount) { // 移位量非正直接返回原对象副本 if (shiftAmount <= 0) { return (BitSet) original.clone(); } BitSet shifted = new BitSet(); // 遍历所有置位的索引,偏移后设置到新BitSet original.stream().forEach(pos -> shifted.set(pos + shiftAmount)); // 如果需要严格限制为初始化的32位长度,可取消下面这行的注释 // shifted.clear(32, shifted.length()); return shifted; }
兼容Java 8之前版本的实现
public static BitSet logicLeftShift(BitSet original, int shiftAmount) { if (shiftAmount <= 0) { return (BitSet) original.clone(); } BitSet shifted = new BitSet(); int pos = original.nextSetBit(0); while (pos != -1) { shifted.set(pos + shiftAmount); pos = original.nextSetBit(pos + 1); } return shifted; }
场景测试示例
对应你给出的测试场景:
BitSet x = new BitSet(32); x.set(2, true); // 第3位置为true,对应索引为2 // 测试左移3位 BitSet shiftedX = logicLeftShift(x, 3); System.out.println(shiftedX.get(5)); // 输出true,原索引2+3=5 System.out.println(shiftedX.get(2)); // 输出false,低位自动补0
额外说明
如果希望直接修改原BitSet而非返回新实例,只需先获取所有置位索引后清空原BitSet,再重新设置偏移后的索引即可。
内容的提问来源于stack exchange,提问作者Frank Fiumara
相关产品推荐
相关产品推荐

