解析高效位反轉

2021-08-28 06:06:57 字數 1139 閱讀 5157

把乙個二進位制數反轉(逆序輸出)的**如下:

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 ...