首页 > 解决方案 > 如何在Java中将两个字节相加,如果有溢出则回绕

问题描述

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

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

我已经制作了一个测试程序,所以我可以使用不同的值。在下面的示例中,我尝试添加两个二进制数,每个表示十进制值 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

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

标签: javachecksumbinary-dataaddition

解决方案


因为您只使用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,则发生溢出并且该位将环绕。


推荐阅读