BitSet LeftShift环绕问题

时间:2016-05-13 00:18:00

标签: java bitset

我正在尝试使用BitSet创建一个在Java中使用环绕进行左移的方法,但我无法弄清楚如何让它进行环绕。现在我的方法只删除第一位并保留其余位而不将第一位添加到结尾。

public static BitSet leftShift(int amount, BitSet b){
    BitSet bit2 = new BitSet(b.length());

    for(int i = b.length(); i > 0; i--){
        bit2.set((i-amount)%b.length(), b.get(i));
    }
    return bit2;
}

1 个答案:

答案 0 :(得分:2)

您的代码中有2个问题。

  1. 循环边界中的逐个错误。 BitSet索引从零开始。因此,您应该从b.length() - 1开始并计入i >= 0或更好,但不要试图成为非传统的,而是通常for (int i = 0; i < b.length(); i++)
  2. 您的指数计算不会包含负数。一种简单的解决方法是在模数:b.length()
  3. 之前添加(i + b.length() - amount) % b.length()

    最后,虽然它不是一个bug,但迭代BitSet的常用方法是使用nextSetBit而不是遍历所有索引。

    总之,它看起来像这样:

    BitSet result = new BitSet(b.length());
    
    for (int i = b.nextSetBit(0); i != -1; i = b.nextSetBit(i + 1)) {
        int j = (i + b.length() - amount) % b.length();  // new index after wrapping
        result.set(j);
    }
    return result;