方法一:(最最容易想到的辦法)
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 每組測試資料佔兩...