對乙個整數按位反轉

2021-05-11 07:15:09 字數 2157 閱讀 5283

記得在以前也是寫過乙個按位反轉(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碼,並不是實際的值...