如何在 Java 中将两个字节加在一起,如果有溢出则环绕

How to add two bytes together in Java, with wrap around if there is overflow

我需要使用补码二进制加法将仅由 ASCII 字符组成的字节数组中的所有字节相加,并将结果存储为单字节校验和。

我试图从基础开始,弄清楚如何只将 2 个字节加在一起,但不知道如何 "wrap around" 如果在添加两个二进制值时有额外的位。

我制作了一个测试程序,所以我可以尝试不同的值。在下面的示例中,我试图添加两个二进制数,每个代表十进制值 255.

byte b1 = (byte) 255;
String s1 = String.format("%8s",Integer.toBinaryString(b1 & 0xFF)).replace(' ', '0');
System.out.println("byte 1: " + s1); // 1111111

byte b2 = (byte) 255;
String s2 = String.format("%8s",Integer.toBinaryString(b2 & 0xFF)).replace(' ', '0');
System.out.println("byte 2: " + s2); // 1111111

byte sum = 0;

sum += b1;
sum += b2;

String s3 = String.format("%8s", Integer.toBinaryString(sum & 0xFF)).replace(' ', '0');
System.out.println("sum of byte 1 and byte 2: " + s3); // should be 1111111

我预计输出为:

字节 1: 11111111
字节 2:11111111
字节 1 和字节 2 的总和:11111111

但实际输出是:

字节 1: 11111111
字节 2:11111111
字节 1 和字节 2 的总和:11111110

如何环绕额外的位以获得正确的结果?

因为您只使用 byte,所以您可以将加法结果存储在更大的原始类型中,例如 int。通过这样做,您将可以轻松访问 溢出位 ,您可以将其提取(使用按位运算)并添加到现有总和中:

int sum = b1 + b2;
sum += (sum >> 8) & 1;
String s3 = String.format("%8s", Integer.toBinaryString(sum & 0xFF)).replace(' ', '0');
System.out.println("sum of byte 1 and byte 2: " + s3); // should be 11111111

如果 溢出位 的值为 0,则什么也不会发生。但是如果是1,就会发生溢出,位会回绕。