繁体   English   中英

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

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

Bit Twiddling Hacks中 ,我看到了这个技巧:

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

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

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

(b * 0x0101010101010101ULL)复制b的8个副本并将其设置在每个字节中。

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

但是我无法弄清楚第三步模量0x1FF中的间隙。

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

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

乘法和运算将b的每个位乘以512的幂。512为(511 + 1)。 平方得到(511 + 1)*(511 + 1)= 511 * 511 + 2 * 511 + 1或513 * 511 + 1,在用511进行修改时将得到1。对于其余的每个位,该平方将继续。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM