You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:06:02