Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 位集左移环绕问题_Java_Bitset - Fatal编程技术网

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()
  • 最后,虽然这不是一个bug,但迭代
    位集的通常方法是使用
    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()
  • 最后,虽然这不是一个bug,但迭代
    位集的通常方法是使用
    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