我创建了以下代码来查找二进制数的奇偶性(即,如果二进制字中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类型的二进制字?按位解决方案是否更有效?谢谢你的帮助!
3条答案
按热度按时间ffscu2ro1#
您引用的代码也使用循环(即while):
你需要承认你正在使用
string
您事先知道的将只由数字组成,并方便地以二进制表示。当然,考虑到这些约束,不需要使用位运算,而只需要使用解析器char
-由-char
并进行所需的计算。另一方面,如果作为参数接收
long
,就像您引用的方法一样,那么使用逐位运算遍历每个bit
(一次)输入一个数字并进行所需的计算。也可以将
long
变成一个string
应用与您应用的相同的逻辑代码,但首先,必须将其转换为long
进入binary
. 然而,这种方法会增加额外的不必要的步骤、更多的代码,而且性能会更差。如果您有一个带约束的字符串,则这一点可能也适用,反之亦然。尽管如此String
不是一个number
,即使它仅由数字组成,这使得使用表示数字的类型(例如。,long
)更理想的方法。您缺少的另一件事是,您完成了一些繁重的工作,将已经存在的数字转换为二进制,并编码为字符串
new CalculateParity("1011101");
. 所以你就跳了一步。现在尝试使用你的方法,但这次使用"93"
找到奇偶校验。b1payxdu2#
如果你想知道一根弦是不是偶数。我觉得下面这个方法比较好。
如果转换的字符串太长,且字符串长度大于64。将会发生错误。
你提到的两种方法都是o(n)性能,不会有太大的不同。但是移位法更精确,cpu使用的时钟也会少一点。
hyrbngr73#
对字符串输入使用基于字符串的方法。不错的选择。
您引用的代码对整数输入使用基于整数的方法。一个同样好的选择。