Как добавить два байта вместе в Java, с переносом, если есть переполнение - PullRequest
4 голосов
/ 19 мая 2019

Мне нужно сложить все байты в байтовом массиве, состоящем только из символов 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

Как обернуть лишний бит, чтобы получить правильный результат?

1 Ответ

3 голосов
/ 19 мая 2019

Поскольку вы работаете только с 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, произошло переполнение, и бит обернется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...