为什么使用位移位而不是 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;
}
我创建了以下代码来查找二进制数的奇偶校验(即,如果二进制字中 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;
}