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