[英]Trial-division code runs 2x faster as 32-bit on Windows than 64-bit on Linux
[英]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.