簡體   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