![](/img/trans.png)
[英]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.