Java中long转BitSet改写及BitSet左移位操作缺失的解决办法
Java BitSet 改写long位操作的实现方案
场景最简改写方案
你当前业务场景中的1L << 位索引本质就是仅指定位置为1的位标记,不需要额外实现左移逻辑,直接用BitSet原生的set()方法就能实现同等效果,位或操作可以用BitSet原生的or()方法,也可以直接多次调用set()更高效。改写后的代码如下:
private static void createOptions(int bit1, int bit2, int bit3, ArrayList<BitSet[]> moves) { // 对应 1L << bit1 BitSet option1a = new BitSet(); option1a.set(bit1); // 对应 (1L << bit2) | (1L << bit3) BitSet option1b = new BitSet(); option1b.set(bit2); option1b.set(bit3); // 对应三个位都置1的结果 BitSet option1c = new BitSet(); option1c.set(bit1); option1c.set(bit2); option1c.set(bit3); moves.add(new BitSet[]{option1a, option1b, option1c}); // 第二组逻辑同理 BitSet option2a = new BitSet(); option2a.set(bit3); BitSet option2b = new BitSet(); option2b.set(bit2); option2b.set(bit1); // 第三项和第一组的第三项完全一致,无修改需求可直接复用 moves.add(new BitSet[]{option2a, option2b, option1c}); }
通用BitSet左移方法实现
如果你后续有需要对已有BitSet做按位左移的场景,可以自己封装工具方法,逻辑是把原BitSet中所有已置位的索引统一加上左移的偏移量,写入新的BitSet即可:
/** * 对输入BitSet执行左移n位操作,返回新的BitSet对象 * @param source 原BitSet * @param shiftN 左移位数 * @return 左移后的BitSet */ public static BitSet leftShift(BitSet source, int shiftN) { if (shiftN < 0) { throw new IllegalArgumentException("左移位数不能为负数"); } BitSet result = new BitSet(); // 遍历所有已置位的索引 for (int i = source.nextSetBit(0); i != -1; i = source.nextSetBit(i + 1)) { // 索引加偏移量后设置到新BitSet result.set(i + shiftN); } return result; }
使用时只需要调用leftShift(待移位的BitSet对象, 左移位数)即可得到和long类型左移同等效果的BitSet结果。
内容的提问来源于stack exchange,提问作者pileup
相关产品推荐
相关产品推荐

