按位反轉整數問題

2021-06-16 09:14:52 字數 1781 閱讀 4166

方法一:(最最容易想到的辦法)

unsigned

int reversebitsinword00(unsigned

int num)

return ret;

}上面的程式通過每次取傳入引數的最後一位( num & 1),然後與要返回的結果相 「 或 」,把傳入引數 num 右移 1 位,要返回的結果左移一位,來實現數字反轉的。

方法二: (對換)

unsigned

int reversebitsinword01(unsigned

int num)

return ret;

}上面的程式通過對換來實現的。

1、先找到低位,然後移動到對應的高位,再與要返回的結果 或 。

2、再找到高位,然後移動到對應的低位,再與要返回的結果 或。

3、迴圈,直至對換 16 次。

方法三: (分而治之)

unsigned

int reversebitsinword02(unsigned

int num)

上面的程式採用的是分而治之的策略( divide and conquer strategy )。把反轉32位的程式分別分解為反轉 2 位、4 位、8位、16位來實現的。無論是對於要反轉幾位,他們的演算法是類似的。

1、取低位,左移。

2、右移,取高位。

3、( 1、2 的結果) 或

方法四: (分而治之)

unsigned

int reversebitsinword03(unsigned

int num)

這個程式採用的也是分而治之的策略( divide and conquer strategy )。把反轉32位的程式分別分解為反轉 2 位、4 位、8位、16位來實現的。無論是對於要反轉幾位,他們的演算法是類似的。

1、取低位,左移。

2、取高位,右移。

3、( 1、2 的結果) 或

第一行**為奇偶位相互交換;第二行為以兩位為一單元,奇偶單元進行交換;第三行為以四位為一單元,奇偶單元進行交換;第四行為以八位為一單元,奇偶單元進行交換;最後一行為以十六位為一單元,奇偶單元進行交換。至此,32位反轉完成,演算法結束。

[求助]請問怎麼實現8位資料對稱反轉。例:10100000b變為0000101b

unsigned char revbitsinbyte(unsigned char x)

開始x(ai(0<=i<8)代表x中的一位): a7 a6 a5 a4 a3 a2 a1 a0

x & 0x55即x & 01010101b後: 0 a6 0 a4 0 a2 0 a0

(x & 0x55) << 1後:

a6 0 a4 0 a2 0 a0 0

x & 0xaa即x & 10101010b後: a7 0 a5 0 a3 0 a1 0

(x & 0xaa) >> 1後:

0 a7 0 a5 0 a3 0 a1

(x & 0x55) << 1 | (x & 0xaa) >> 1後 a6 a7 a4 a5 a2 a3 a0 a1

x = (x & 0x55) << 1 | (x & 0xaa) >> 1;後x變成

a6 a7 a4 a5 a2 a3 a0 a1

之後同理

x = (x & 0x33) << 2 | (x & 0xcc) >> 2;後x變成

a4 a5 a6 a7 a0 a1 a2 a3

x = (x & 0x0f) << 4 | (x & 0xf0) >> 4;後x變成

a0 a1 a2 a3 a4 a5 a6 a7

反轉完畢

對乙個整數按位反轉

記得在以前也是寫過乙個按位反轉 reversing bits 的文章,都是自己的,寫的傻乎乎的。這次重新對它進行了書寫。再加上由於看了 henry s.warren 的 hacker s delight 一書中的有關 reversing bits 的相關介紹,所以寫了這篇筆記。unsigned in...

整數按位輸出

10 輸入乙個五位以內的正整數,1 判斷它是乙個幾位數 2 請按序輸出其各位數字 3 逆序輸出其各位數字。include include int ten2 int n 定義乙個函式,以備除數使用 void main while num1 0 printf the number of digit is...

按位AND和按位OR

description 已知長度為n的兩個位串a和b,求它們的按位and和按位or。input 多組測試資料,每組測試資料第1行輸入位串長度n 0 n 64 第2行輸入n個以空格隔開的取值為0或1的整數表示位串a,第3行輸入n個以空格隔開的取值為0或1的整數表示位串b。output 每組測試資料佔兩...