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

How does this code compute parity of a byte using 64-bit multiply and modulus division

本文关键字:计算 除法 字节 偶校验 奇偶 代码 何使用 64位      更新时间:2023-10-16

从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。

有谁能帮我解释一下吗?一个好的例子会很有帮助。

乘法运算将b中的每个位以512的幂相乘。512等于(511+1)平方得到(511+1)*(511+1)=511*511+2*511+1或513*511+1,这将在511建模时得到1。