Java 计算8位校验和的程序
Java program to calculate 8-bit checksum
我有一个作业要计算一些 8 位二进制数的校验和。
我已经走了很长一段路,但出于某种原因,它给了我错误的结果。例如,如果 x 是:10101010 并且 y 是:01101111,则校验和将为 11100110。但是我的代码给出的校验和为 01101110(全部反转)。 请注意,求和的反转发生在一个不同的、已经制定的方法中。意味着我的方法是 returning 10010001,但应该是 return 00011001。
我哪里做错了?
Octet-method 已经制作好了。
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;
}
这里的要点是你不想使用异或。只有整数运算才能让您将三个值组合在一起,并在所有情况下都得到正确的结果。因此,您将三个值相加,然后提取结果中的两位(结果位 + 进位位)。
我不知道你的第二个循环在你的 sum
函数中应该做什么,但正如所写的那样,它永远不会进入循环,所以无论如何也不会做任何事情。
我给你的 Octet
添加了一个 toString
方法 class:
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
我有一个作业要计算一些 8 位二进制数的校验和。 我已经走了很长一段路,但出于某种原因,它给了我错误的结果。例如,如果 x 是:10101010 并且 y 是:01101111,则校验和将为 11100110。但是我的代码给出的校验和为 01101110(全部反转)。 请注意,求和的反转发生在一个不同的、已经制定的方法中。意味着我的方法是 returning 10010001,但应该是 return 00011001。
我哪里做错了?
Octet-method 已经制作好了。
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;
}
这里的要点是你不想使用异或。只有整数运算才能让您将三个值组合在一起,并在所有情况下都得到正确的结果。因此,您将三个值相加,然后提取结果中的两位(结果位 + 进位位)。
我不知道你的第二个循环在你的 sum
函数中应该做什么,但正如所写的那样,它永远不会进入循环,所以无论如何也不会做任何事情。
我给你的 Octet
添加了一个 toString
方法 class:
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