Объяснение операций с контрольной суммой и битами BSD

Я пытаюсь понять алгоритм вычисления контрольной суммы 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; 

}

И мои вопросы:

  1. Почему мы используем побитовое & в этой строке checksum = (byte) ((checksum + cur_byte) & 0xFF);? 0xFF является двоичным «11111111», и эта операция не всегда возвращает одно и то же число?
  2. В чем смысл этой операции? контрольная сумма = (байт) (((контрольная сумма и 0xFF) >>> 1) + ((контрольная сумма и 0x1) ‹‹ 7)); Я понимаю бинарные операции, логические и арифметические сдвиги, но не понимаю, что мы делаем.

Спасибо за помощь :)


person wukkie    schedule 16.01.2015    source источник


Ответы (1)


  1. b & 0xFF часто используется для приведения байта со знаком к идентичному по битам целому числу. В данном случае это не нужно - (byte)(b & 0xFF) идентичен (b). Например ((байт)-1) & 0xFF = 255

  2. 12345678 >>>1 01234567
    12345678 ‹‹7 80000000 ДОБАВИТЬ -> 81234567

Таким образом, это циклическое вращение

person Sergey Alaev    schedule 16.01.2015