2011-09-19 113 views
1

比特反轉逆轉位的整數x

我發現一種用於在整數x反轉比特這個代碼(假設32位值):

unsigned int 
reverse(register unsigned int x) 
{ 
x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1)); 
x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2)); 
x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4)); 
x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8)); 
return((x >> 16) | (x << 16)); 
} 

我無法瞭解邏輯/該代碼背後的算法。所有幻數的目的是什麼?

+2

http://stackoverflow.com/questions/746171/best-algorithm-for-bit-reversal-from-msb-lsb -to-LSB-MSB-在-C – StuartLC

回答

6

讓我們看看它是如何爲一個8位值來實現:

函數中的第一行需要每秒位和移動它向左或向右:

12345678 --> 1-3-5-7- --> -1-3-5-7 --> 21436587 
       -2-4-6-8  2-4-6-8- 

第二行需要的羣體兩位與向左或向右移動:

21436587 --> 21--65-- --> --21--65 --> 43218765 
       --43--87  43--87-- 

第三行需要的4位,移動組向左或向右:

43218765 --> 4321---- --> ----4321 --> 87654321 
       ----8765  8765---- 

現在位反轉。對於一個32位的值需要在的8組移動比特的兩個更多的步驟和16

+0

怎麼樣一個16位的值? – user7

+0

@ user639309:然後,你需要四個步驟,以及16位掩碼,像加上0xAAAA和將0x5555的第一步。如果你有一個16位的數據類型,你可以使用像在問題的代碼的最後一步轉變,否則你在前面的步驟,以掩蓋喜歡的值。 – Guffa

1

這是位掩碼。用二進制形式寫下來,記住bitwise and是如何工作的。你也可以拿一張紙,寫下每一步的口罩,輸入和結果來整理它。