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

标签 java for-loop bit bit-shift

我创建了以下代码来查找二进制数的奇偶校验(即,如果二进制字中 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 类型的二进制字)更有效/标准的解决方案?按位解决方案是否更有效?我感谢任何帮助!

最佳答案

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

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

您需要确认您正在使用一个字符串,您事先知道该字符串将仅由数字组成,并且方便地采用二进制表示形式。当然,考虑到这些限制,我们不需要使用按位运算,而只需解析 char 逐个char 并执行所需的计算。

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

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

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

关于java - 为什么使用位移而不是 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64983120/

相关文章:

java - 解决java中的类名冲突

java - 如何将我的程序分解为多个方法?

performance - “for”循环与 MATLAB 中的矢量化

performance - 如果 CPU 是二进制机器,为什么它在位操作上很慢?

java - 退出 HttpClient session

c++ - 循环和 strcpy

python - 连接两个列表的笛卡尔积的字符串(最好没有 for 循环)

java - 优化Java中的128位序列按位运算

c - 如何在C中设置整数的最低有效位

java - Java获取内存数据