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

3wabscal  于 2021-07-08  发布在  Java
关注(0)|答案(3)|浏览(421)

我创建了以下代码来查找二进制数的奇偶性(即,如果二进制字中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;
}

为什么会这样?是什么让逐位运算符比我提出的解决方案更有效/更标准的呢?我提出的解决方案是简单地遍历string类型的二进制字?按位解决方案是否更有效?谢谢你的帮助!

ffscu2ro

ffscu2ro1#

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

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

你需要承认你正在使用 string 您事先知道的将只由数字组成,并方便地以二进制表示。当然,考虑到这些约束,不需要使用位运算,而只需要使用解析器 char -由- char 并进行所需的计算。
另一方面,如果作为参数接收 long ,就像您引用的方法一样,那么使用逐位运算遍历每个 bit (一次)输入一个数字并进行所需的计算。
也可以将 long 变成一个 string 应用与您应用的相同的逻辑代码,但首先,必须将其转换为 long 进入 binary . 然而,这种方法会增加额外的不必要的步骤、更多的代码,而且性能会更差。如果您有一个带约束的字符串,则这一点可能也适用,反之亦然。尽管如此 String 不是一个 number ,即使它仅由数字组成,这使得使用表示数字的类型(例如。, long )更理想的方法。
您缺少的另一件事是,您完成了一些繁重的工作,将已经存在的数字转换为二进制,并编码为字符串 new CalculateParity("1011101"); . 所以你就跳了一步。现在尝试使用你的方法,但这次使用 "93" 找到奇偶校验。

b1payxdu

b1payxdu2#

如果你想知道一根弦是不是偶数。我觉得下面这个方法比较好。
如果转换的字符串太长,且字符串长度大于64。将会发生错误。
你提到的两种方法都是o(n)性能,不会有太大的不同。但是移位法更精确,cpu使用的时钟也会少一点。

private static boolean isEven(String s){
        char[] chars = s.toCharArray();
        int i = 0;
        for(char c : chars){
            i ^= c;
        }
        return i == 0;
}
hyrbngr7

hyrbngr73#

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

相关问题