从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。
任何人都可以帮忙解释一下吗?一个很好的例子将非常有用。
答案 0 :(得分:0)
乘法和运算将b
中的每个位乘以512的增加功率.512为(511 + 1)。给出(511 + 1)*(511 + 1)= 511 * 511 + 2 * 511 + 1或513 * 511 + 1的平方,当用511进行修改时将给出1。对于每个剩余的位,这将继续。 / p>