1. 程式人生 > >向大牛學習!

向大牛學習!

在刷到LeetCode 190. reverse bits中,抱著學習的態度對Discuss的大牛程式碼進行學習,發現了使用很巧妙的位操作的答案,其程式碼如下,該程式碼為LeetCode 190 Discuss高贊程式碼,非原創。

uint32_t reverseBits(uint32_t n) {
n = (n >> 16) | (n << 16);
n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8);
n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4);
n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2);
n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1);
return n;
}
其中,使用了0xaaaaaaaa,0x55555555等十分奇怪的字元,下面介紹對該部分字元進行介紹.

在C/C++中,0x為十六進位制的字首標識,0位八進位制的字首標識,十進位制沒有字首標識。

因此,那些奇怪的字元為整數的十六進位制表示。有那麼多的整數,為何在涉及位操作程式中會出現這些整數呢。

因為這些整數的二進位制形式很特殊,可以藉助Windows系統自帶的計算器,快捷計算出該整數的二進位制形式

0xaaaaaaaa = 10101010101010101010101010101010 (偶數位為1,奇數位為0)

0x55555555 = 1010101010101010101010101010101 (偶數位為0,奇數位為1)

0x33333333 = 110011001100110011001100110011 (1和0每隔兩位交替出現)

0xcccccccc = 11001100110011001100110011001100 (0和1每隔兩位交替出現)

0x0f0f0f0f = 00001111000011110000111100001111 (1和0每隔四位交替出現)

0xf0f0f0f0 = 11110000111100001111000011110000 (0和1每隔四位交替出現)

利用上述具有特殊二進位制的整數,可以很方便進行位操作,而且該整數的十六進位制形式比較好記,也不用寫那麼多的0,1.
---------------------
作者:zhusf16
來源:CSDN
原文:https://blog.csdn.net/u012604810/article/details/80623241
版權宣告:本文為博主原創文章,轉載請附上博文連結!