该代码如何使用64位乘法和模数除法计算字节的奇偶校验

时间:2015-10-18 00:32:43

标签: c++ bit-manipulation bit

Bit Twiddling Hacks,我看到了这个诀窍:

unsigned char b;  // byte value to compute the parity of

bool parity = 
  (((b * 0x0101010101010101ULL) & 0x8040201008040201ULL) % 0x1FF) & 1;

我花了几个小时试着理解为什么它需要模数0x1FF。它是如何工作的?为什么它必须是0x1FF?

(b * 0x0101010101010101ULL)制作8份b并在每个字节中设置它们。

((b * 0x0101010101010101ULL) & 0x8040201008040201ULL)从每个副本中提取不同的位。

但我无法弄清楚第三步模数0x1FF的差距。

最后一步是检查最后一位是否为1。

任何人都可以帮忙解释一下吗?一个很好的例子将非常有用。

1 个答案:

答案 0 :(得分:0)

乘法和运算将b中的每个位乘以512的增加功率.512为(511 + 1)。给出(511 + 1)*(511 + 1)= 511 * 511 + 2 * 511 + 1或513 * 511 + 1的平方,当用511进行修改时将给出1。对于每个剩余的位,这将继续。 / p>