BSD checksum 和 bits 操作解释

BSD checksum and bits operations explanation

我试着理解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”,这个操作不是 return 总是这个相同的数字吗?
  2. 这个操作是什么感觉?校验和 = (字节) (((校验和 & 0xFF) >>> 1) + ((校验和 & 0x1) << 7));我懂二进制运算和逻辑和算术移位,但不明白我们在做什么。

感谢您的帮助:)

  1. b & 0xFF 通常用于将有符号字节转换为位相同的 int。在这种情况下,它是不必要的 - (byte)(b & 0xFF) 与 (b) 相同。例如 ((byte)-1) & 0xFF = 255

  2. 12345678 >>>1 01234567
    12345678 <<7 80000000 添加 -> 81234567

如此循环