日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对一个整数按位反转

發布時間:2023/12/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对一个整数按位反转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
記得在以前也是寫過一個按位反轉(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 的相關介紹。?

轉載于:https://www.cnblogs.com/duadu/archive/2007/06/07/6335440.html

總結

以上是生活随笔為你收集整理的对一个整数按位反转的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。