把乙個二進位制數反轉(逆序輸出)的**如下:
unsigned
char
fun4
(unsigned
char c)
實際上,這段**的原理很簡單。
就是先2位一組反轉,再4位一組反轉,最後8位一組反轉。其中,4位一組反轉時,把一組分為兩半看,每一半都已經反轉了,所以只要將兩半對調即可。8位一組同理。
對於2
k2^k
2k位的二進位制數,將其分為兩半,每一半都是2k−
12^
2k−1
位,反轉後,兩半的順序一定會被顛倒。對2k−
12^
2k−1
進行分析也是同理,由此可得遞迴關係。最後到2位一組時,只要顛倒兩位即可。
由於對於只顛倒32位或64位的整數,計算機可以一次讀取,用遞迴函式就殺雞用牛刀了,所以採用遞推,並結合位運算。從2位一組開始,遞推到2
k2^k
2k位一組。
c =
(c &
0xaa
)>>1|
(c &
0x55
)<<
1;
注意到0xaa其實是(10,
10,10,
10)
2(10,10,10,10)_2
(10,10
,10,
10)2
,0x55其實是(01,
01,01,
01)
2(01,01,01,01)_2
(01,01
,01,
01)2
,以兩位一組看,可以很容易看出,這步操作是並行地把4個2位組反轉了。(這個位反轉演算法之所以經典就是因為用了並行的思想)
0xcc為(
1100
,1100)2
(1100,1100)_2
(1100,
1100
)2,0x33為(
0011
,0011)2
(0011,0011)_2
(0011,
0011
)2,對每個4位組,第二行**把高2位組和低2位組對調。
以此類推。
位反轉演算法
比如0x12 0001 0010 反轉後變成 0100 1000 即0x48 static unsigned char buf 0x12,buf1 0 static int m,n for m 7,n 0 m n 0 m n buf buf1 將兩位元組short型別數高低位元組取出來 unsign...
整數反轉解析
假設環境不允許儲存 64 位整數 有符號或無符號 輸入 123 輸出 321 輸入 123 輸出 321 首先實現整數反轉 123反轉為321 當它不是1位數時,拿到它的每一位 while n 10 第一次拿到3,第二次拿到2,輸出結果要為32 既然要反轉,那麼第一次拿到的數字就要比第二次拿到的數字...
高效位操作技巧
檢測乙個無符號數是不為2 n 1 為冪 x x 1 將最右側0位改為1位 x x 1 二進位制補碼運算公式 x x 1 x 1 x x 1 x x 1 x x 1 x y x y 1 x y x y x y x y 1 x y x y x y x y x y x y x y y x y x y x ...