BitSet LeftShift环绕问题



我正试图使用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. 在循环边界中出现一个错误。CCD_ 2索引为零。所以你应该从b.length() - 1开始,计算到i >= 0或更好,但不要试图打破常规,而是做通常的for (int i = 0; i < b.length(); i++)
  2. 您的索引计算不包含负数。一个简单的解决方法是在模(i + b.length() - amount) % b.length()之前添加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;

最新更新