奇偶校验使用 "modulo"

Parity using "modulo"

我 运行 进入这个,同时查找找到奇偶校验的算法,这被认为是有效的:

function usingModulo(v) {
    v ^= v >> 1
    v ^= v >> 2
    v = (v & 0x11111111) * 0x11111111
    return (v >> 28) & 1
}

有人可以解释一下这实际上是如何工作的吗?

v ^= v >> 1

之后v中的bit 2i是bit 2i和2i+1的奇偶校验。

v ^= v >> 2

之后v中的bit 4i就是bits 4i,4i+1,4i+2,4i+3的奇偶校验。

v = (v & 0x11111111) * 0x11111111

在此之后,v 的前 4 位包含旧 v 中位置 4i 的位的总和,特别是位置 28 的位将包含总和的最低有效位,这将是输入数字中所有位的奇偶性。

return (v >> 28) & 1

这将提取位置 28 的位(所有位的奇偶校验)。

更新

要详细解释第 3 步中的乘法,将乘法视为一系列移位和加法可能会有所帮助。

例如,要以 10 为底数将数字 x 乘以 111,您可以将 100x 和 10x 与 x 相加。

类似地,将 x 乘以 0x11111111 与将 x 移动 0,4,8,... 并将结果相加是相同的。

当考虑一系列移位和加法时,最高位将包含所有移位和加在一起的奇偶校验位可能更有意义。