2013-02-20 22 views
2

我看到的鏈接http://pvtridvs.net/pool/bithacks.html#BitReverseObvious這裏發佈的代碼:反向位明顯的方式

unsigned int v;   // reverse the bits in this 
unsigned int t = v;  // t will have the reversed bits of v 
int i; 

for (i = sizeof(v) * 8 - 1; i; i--) 
{ 
    t <<= 1; 
    v >>= 1; 
    t |= v & 1; 
} 

有人能幫忙解釋一下爲什麼這個樣子,簡單的算法的工作?我在紙上測試了一些最簡單的例子,比如說4位0011等等,它可以工作,但我不明白爲什麼這三行移位和按位操作可以實現它。

謝謝,

+0

該URL有「第一種方法需要大約18個操作...」,我不同意。第一種方法每次迭代執行6次操作,其他180次操作執行32次迭代。 – 2013-02-20 04:20:38

回答

4

它轉移的v低位置的比特「out」和「在」向t低的位置。將這些變量看作堆棧的位。您正在彈出v中的位,並將它們推入t。從一個列表彈出並推入另一個最初爲空的列表是反轉任何列表的簡單方法。初始化只是將最低位的初始「推」到結果上。這個技巧可以節省一個小狗並推動(即左右移動)。例如。對於一個字節,只需要7個彈出按鈕。

+0

「注意t的初始化是無用的。」不正確 - 這是至關重要的,爲了得到'v'的最低有效位。 – 2013-02-20 04:14:55

+0

夠正確。抱歉。 – Gene 2013-02-20 04:39:32

0

每一輪t都向上移位一位,v向下移位一位;並且當前最後的但是v被放置在t的末尾。