Я пытаюсь понять алгоритм вычисления контрольной суммы BSD, написанный на языке Java.
Вики пишет:
byte checksum(byte[] input) {
byte checksum = 0;
for (byte cur_byte: input) {
checksum = (byte) (((checksum & 0xFF) >>> 1) + ((checksum & 0x1) << 7)); // Rotate the accumulator
checksum = (byte) ((checksum + cur_byte) & 0xFF); // Add the next chunk
}
return checksum;
}
И мои вопросы:
- Почему мы используем побитовое & в этой строке checksum = (byte) ((checksum + cur_byte) & 0xFF);? 0xFF является двоичным «11111111», и эта операция не всегда возвращает одно и то же число?
- В чем смысл этой операции? контрольная сумма = (байт) (((контрольная сумма и 0xFF) >>> 1) + ((контрольная сумма и 0x1) ‹‹ 7)); Я понимаю бинарные операции, логические и арифметические сдвиги, но не понимаю, что мы делаем.
Спасибо за помощь :)