Java程序计算8位校验和



我有一个赋值来计算多个8位二进制数的校验和。我已经走了很长的路,但由于某种原因,这给了我错误的结果。例如,如果x是10101010,y是01101111,则校验和将是11100110。但我的代码给出了校验和01101110(倒过来的是一个all(请注意,求和的反转发生在另一种已经完成的方法中这意味着我的方法返回10010001,但应该返回00011001。

我哪里错了?

Octet方法已经制作完成。

int[] x = new int[8];
Octet(String s){
if (s.length() != 8) {
System.out.println("Too few or too many characters");
return;
}
for (int i = 0; i < 8; i++) {
if (s.charAt(i) == '1') {
x[7 - i] = 1;
}
else {
x[7 - i] = 0;
}
}
}

Octet sum(Octet y) {
Octet result = new Octet("00000000");

int carry = 0;
for(int i = 0; i < 8; i++) {
result.x[i] = x[i] ^ y.x[i] + carry;
carry = x[i] & y.x[i];
}
if(carry == 1) {
for(int i = 0; i < 8 && carry == 0; i++) {
result.x[i] = result.x[i] ^ carry;
carry = result.x[i] & carry;
}
}

return result;
} 

您的问题主要是对同一整数值错误地混合了二进制(XOR(和整数(+(运算。既然要将三个值组合在一起,就应该坚持加法。

如果所有这些都可以重写,我会把比特存储在一个整数中,在这种情况下,你几乎可以免费获得逻辑。但是,如果这是一个不能更改八进制的定义的练习,那么这里有一个sum函数,它可以在处理整数的基础上做正确的事情:

Octet sum(Octet y) {
Octet result = new Octet("00000000");
int carry = 0;
for(int i = 0; i < 8; i++) {
int a = x[i] + y.x[i] + carry;
result.x[i] = a & 1;
carry = a >> 1;
}
return result;
}

这里的要点是,您不希望使用XOR。只有整数运算才能将三个值组合在一起,并在所有情况下获得正确的结果。因此,您将三个值相加,然后提取得到的两个位(结果位+进位位(。

我不知道sum函数中的第二个循环应该做什么,但正如所写的,它永远不会进入循环,所以无论如何都不会做任何事情。

我在Octet类中添加了一个toString方法:

public String toString() {
StringBuilder r = new StringBuilder();
for (int i = 0 ; i < 8 ; i++) {
r.append(x[7-i] == 1? "1" : "0");
}
return r.toString();
}

以便该测试代码给出正确、可读的结果:

public static void main(String[] args) {
Octet x = new Octet("10101010");
Octet y = new Octet("01101111");
Octet z = x.sum(y);
System.out.println(z);
}

结果:

00011001

最新更新