java - 如何在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
我如何环绕额外的位以获得正确的结果?
解决方案
因为您只使用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
,则发生溢出并且该位将环绕。