記得在以前也是寫過乙個按位反轉(reversing bits)的文章,**都是自己的,寫的傻乎乎的。
這次重新對它進行了書寫。再加上由於看了 henry s. warren 的 《hacker's delight》一書中的有關
reversing bits 的相關介紹,所以寫了這篇筆記。
unsigned int reversebitsinword00(unsigned int num)
unsigned int ret = 0;
int i;
for(i=0;i<32;i++)
ret <<= 1;
ret |= num & 1;
num >>= 1;
return ret;
上面的程式通過每次取傳入引數的最後一位( num & 1),然後與要返回的結果相 「 或 」,
把傳入引數 num 右移 1 位,要返回的結果左移一位,來實現數字反轉的。
unsigned int reversebitsinword01(unsigned int num)
unsigned int ret = 0;
int i;
for(i=0;i<16;i++)
ret |= (num & (1 << i)) << (31-2*i);
ret |= (num & (0x80000000 >> i) ) >> (31-2*i);
return ret;
上面的程式通過對換來實現的。
1、先找到低位,然後移動到對應的高位,再與要返回的結果 或 。
2、再找到高位,然後移動到對應的低位,再與要返回的結果 或。
3、迴圈,直至對換 16 次。
unsigned int reversebitsinword02(unsigned int num)
num = (num & 0x55555555) << 1 | (num >> 1) & 0x55555555;
num = (num & 0x33333333) << 2 | (num >> 2) & 0x33333333;
num = (num & 0x0f0f0f0f) << 4 | (num >> 4) & 0x0f0f0f0f;
num = (num & 0x00ff00ff) << 8 | (num >> 8) & 0x00ff00ff;
num = (num & 0x0000ffff) << 16 | (num >> 16) & 0x0000ffff;
return num;
上面的程式採用的是分而治之的策略( divide and conquer strategy )。把反轉32
位的程式分別分解為反轉 2 位、4 位、8位、16位來實現的。無論是對於要反轉幾位,他們的演算法
是類似的。
1、取低位,左移。
2、右移,取高位。
3、( 1、2 的結果) 或
unsigned int reversebitsinword03(unsigned int num)
num = (num & 0x55555555) << 1 | (num & 0xaaaaaaaa) >> 1;
num = (num & 0x33333333) << 2 | (num & 0xcccccccc) >> 2;
num = (num & 0x0f0f0f0f) << 4 | (num & 0xf0f0f0f0) >> 4;
num = (num & 0x00ff00ff) << 8 | (num & 0xff00ff00) >> 8;
num = (num & 0x0000ffff) << 16 | (num & 0xffff0000) >> 16;
return num;
這個程式採用的也是分而治之的策略( divide and conquer strategy )。把反轉32
位的程式分別分解為反轉 2 位、4 位、8位、16位來實現的。無論是對於要反轉幾位,他們的演算法
是類似的。
1、取低位,左移。
2、取高位,右移。
3、( 1、2 的結果) 或
上面的四個程式,前兩個是我寫的,是乙個按照常規思維方式寫的**。後面的兩個來自於 henry s.
warren 的 《hacker's delight》一書中的有關 reversing bits 的相關介紹。
按位反轉整數問題
方法一 最最容易想到的辦法 unsigned int reversebitsinword00 unsigned int num return ret 上面的程式通過每次取傳入引數的最後一位 num 1 然後與要返回的結果相 或 把傳入引數 num 右移 1 位,要返回的結果左移一位,來實現數字反轉的...
lintcode 反轉乙個3位整數
突然發現了很久之前寫的文件,發出來記錄一下自己出現的錯誤 def reverseinteger number temp str number result temp 1 result int result 如果不加int會以字串輸入,導致輸入700會輸出007,而我們需要的是7 return res...
Lintcode 37 反轉乙個3位整數
public class reversenumbers system.out.println integer.parseint str public static void main string args 收穫 1.字元型別轉成int型 int char 得到的是字元的ascii碼,並不是實際的值...