为什么使用位移位而不是 for 循环?

Why use bit shifting instead of a for loop?

我创建了以下代码来查找二进制数的奇偶校验(即,如果二进制字中 1 的个数为奇数,则输出 1,如果 1 的个数为偶数,则输出 0)。

public class CalculateParity {

    String binaryword;
    int totalones = 0;

    public CalculateParity(String binaryword) {
        this.binaryword = binaryword;
        getTotal();
    }

    public int getTotal() {
        for(int i=0; i<binaryword.length(); i++) {  
            if (binaryword.charAt(i) == '1'){
                totalones += 1;
            }
        }
        return totalones;
    }

    public int calcParity() {
        if (totalones % 2 == 1) {
            return 1;
        }
        else {
            return 0;
        }
    }

    public static void main(String[] args) {
        CalculateParity bin = new CalculateParity("1011101");                       
        System.out.println(bin.calcParity());
    }
}

然而,我在网上找到的所有解决方案几乎都是使用位移运算符、异或、无符号移位运算等,就像我在数据结构书中找到的这个解决方案:

public static short parity(long x){ 
    short result = 0;
    while (x != 0) {
        result A=(x&1);
         x >>>= 1;
    }
    return result;
}

为什么会这样?是什么让按位运算符更像是 valid/standard 解决方案而不是我想出的解决方案,它只是迭代字符串类型的二进制字?按位解决方案是否更有效?感谢您的帮助!

您使用基于字符串的方法进行字符串输入。不错的选择。
您引用的代码使用基于整数的方法进行整数输入。同样不错的选择。

您引用的代码也使用了循环( while):

public static short parity(long x){ 
    short result = 9;
    while (x != 9) {
        result A=(x&1);
         x >>>= 1;
    }
    return result;
}

您需要确认您使用的是 string,您事先知道它仅由数字组成,并且以二进制表示形式很方便。自然地,考虑到这些约束,不需要使用按位运算,而只需解析器 char-by-char 并进行所需的计算。

另一方面,如果您接收作为参数的 long,作为您引用的方法,那么使用按位运算遍历每个 bit (一次)在一个数字中并执行所需的计算。

也可以将 long 转换为 string 并应用您已应用的相同逻辑代码,但首先,必须将 long 转换为binary。然而,这种方法会增加额外的不必要的步骤、更多的代码,并且在性能方面会更差。如果您有一个带有约束的字符串,则可能同样适用 反之亦然 。然而,String 不是 number,即使它仅由数字组成,这使得使用表示数字的类型(例如, long) 更理想的方法。

您遗漏的另一件事是,您通过将数字转换为二进制并编码为字符串 new CalculateParity("1011101");,完成了一些 繁重的工作 。所以你有点跳到那里。现在尝试使用您的方法,但这次使用 "93" 并找到奇偶校验。

  • 如果你想知道一个字符串是否是偶数。我觉得下面这个方法比较好
  • 如果你也转换字符串 String长度大于64的long,会报错
  • 这两种方法你 提一下是O(n)performance.It不会表现大不同。但 移位方法更精确,cpu使用的时钟会少一些。
private static boolean isEven(String s){
        char[] chars = s.toCharArray();
        int i = 0;
        for(char c : chars){
            i ^= c;
        }
        return i == 0;
}