Java 位集左移环绕问题
我试图使用Java 位集左移环绕问题,java,bitset,Java,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.leng
位集
在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;
}
您的代码中有两个问题
b.length()-1
开始,并计数到i>=0
或更好,但不要尝试非常规,而是对(int i=0;i
(i+b.length()-amount)%b.length()之前添加b.length()
位集的通常方法是使用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;
您的代码中有两个问题
循环边界中的一个错误关闭<代码>位集
索引是基于零的。因此,您应该从b.length()-1
开始,并计数到i>=0
或更好,但不要尝试非常规,而是对(int i=0;i
(i+b.length()-amount)%b.length()之前添加b.length()
位集的通常方法是使用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;
“左移位”是指向更高或更低的有效位移位?您的代码似乎试图向低有效位移位,这通常称为右移。向低有效位移位。所以11011应该是10111,左移一次。你说的“左移”是指向高有效位还是低有效位移动?您的代码似乎试图向低有效位移位,这通常称为右移。向低有效位移位。所以11011应该是10111,左移一次。好吧,我试了一下你给我的,它给出了C1的正确左移,但不是D1。C:11110000110010101010111111 D:010101010110011001111111 C1:11100001011001011011111 D1:10101010110011001111111似乎是b.nextSetBit(0);它在D1上失败,因为第一位不是1,所以它完全跳过了它。你是如何得到那些用0和1表示的字符串的?你可能有一只虫子在那里。我发布的程序在您指定的输入上正常工作。我只是将其称为for循环。对于(inti=0;i