最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c#二進(jìn)制逆序方法詳解

 更新時(shí)間:2013年10月03日 15:56:03   作者:  
這篇文章介紹了c#二進(jìn)制逆序方法,有需要的朋友可以參考一下

原題

一個(gè)整數(shù),可以表示為二進(jìn)制的形式,請(qǐng)給出盡可能多的方法對(duì)二進(jìn)制進(jìn)行逆序操作。 例如:10000110 11011000的逆序?yàn)?00011011 01100001

分析

題目中說是一個(gè)整數(shù),對(duì)它的二進(jìn)制進(jìn)行逆序。并不是一個(gè)01字符串,或者01的數(shù)組。那么我們?cè)撊绾谓鉀Q這個(gè)問題呢?方法還是比較多的,有的中規(guī)中矩、有的非常巧妙。我們要掌握中規(guī)中規(guī)的方法,見識(shí)更多的巧妙的方法。慢慢的,能夠舉一反三,在遇到新的問題時(shí),能夠有靈思妙想。

最直接的方法

直接的方法,很容易想到:有如下代碼:

復(fù)制代碼 代碼如下:

直接的方法,很容易想到:有如下代碼: int v = 111;
int r = v;
int s = 32;
for (; 0 != v; v >>= 1) {
    r <<= 1;
    r |= v & 1;
    s--;
}
r <<= s;
System.out.println(r);

代碼比較好理解,取到v的最低位,作為r的最高位;v每取一次最低位,則右移一位;r每確定一位,則左移一位。同時(shí)記錄移動(dòng)了多少位,最終要補(bǔ)齊。

通過查表的方法

在遇到位操作的問題時(shí),往往題目中限定了總的位數(shù),比如這個(gè)題目,我們可以認(rèn)為32位。這就給我們帶來了一個(gè)以空間換時(shí)間的解決思路:查表法。位數(shù)是固定的,可以申請(qǐng)空間,存儲(chǔ)預(yù)先計(jì)算好的結(jié)果,在計(jì)算其他的結(jié)果的時(shí)候,則查表即可。

32位相對(duì)于查表來講,還是太大了。既然這樣縮小范圍,32個(gè)bit,也就是4個(gè)byte。每個(gè)byte 8bit,可以表示0-255的整數(shù)。可以通過申請(qǐng)256大小的數(shù)組,保存這256個(gè)整數(shù),二進(jìn)制逆序之后的整數(shù)。然后將一個(gè)32位的整數(shù),劃分為4個(gè)byte,每一個(gè)byte查表得到逆序的整數(shù):r1,r2,r3,r4。按照r4r3r2r1順序拼接二進(jìn)制得到的結(jié)果就是最終的答案。

這是一個(gè)思路,大家可以進(jìn)一步思考,嘗試。

巧妙的方法

我們這里主要分析這個(gè)巧妙的方法,核心思想是:分治法。即:

•逆序32位分解為兩個(gè)逆序16位的
•逆序16位分解為兩個(gè)逆序8位的
•逆序8位分解為兩個(gè)逆序4位的
•逆序4位分解為兩個(gè)逆序2位的
最后一個(gè)2位的逆序,直接交換即可。也就是分治遞歸的終止條件。但是,在上面的過程中,還沒有應(yīng)用到位操作的技巧。根據(jù)動(dòng)態(tài)規(guī)劃的思想,我們可以自底向上的解決這個(gè)問題:

•每2位為一組,進(jìn)行交換,完成2位逆序
•每4位為一組,前面2位與后面2位交換,完成4位逆序
•每8位為一組,前面4位和后面4為交換,完成8位的逆序
•每16位為一組,前面8位和后面8位交換,完成16位的逆序
2組16位的交換,完成32位的逆序

通過下面的例子,詳解上面的過程,我們以16位為例:10000110 11011000

1 0 0 0 0 1 1 0 1 1 0 1 1 0 0 0
0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 0
0 0 0 1 0 1 1 0 1 0 1 1 0 0 0 1
0 1 1 0 0 0 0 1 0 0 0 1 1 0 1 1
0 0 0 1 1 0 1 1 0 1 1 0 0 0 0 1

經(jīng)過4步,逆序完成。推而廣之,總的時(shí)間復(fù)雜度為O(logn),n是二進(jìn)制的位數(shù)。這個(gè)方法可以推廣到任意位。

示例代碼如下:

int v =111;
v =((v >>1)&0x55555555)|((v &0x55555555)<<1);
v =((v >>2)&0x33333333)|((v &0x33333333)<<2);
v =((v >>4)&0x0F0F0F0F)|((v &0x0F0F0F0F)<<4);
v =((v >>8)&0x00FF00FF)|((v &0x00FF00FF)<<8);
v =( v >>16)|( v <<16);System.out.println(v);上面的思路理解了,代碼不難理解。例如第二行,前邊是取偶數(shù)位,后面是取奇數(shù)位,奇數(shù)位左移一位,偶數(shù)位右移一位,再取或,就是交換了奇數(shù)偶數(shù)位。也就是第一個(gè)步驟。

基于位運(yùn)算的一些巧妙的方法有很多。大家可以自行研究,后面會(huì)和大家分享更多的面試題目。

【分析完畢】

相關(guān)文章

  • C#事件用法實(shí)例淺析

    C#事件用法實(shí)例淺析

    這篇文章主要介紹了C#事件用法,以實(shí)例形式分析了C#中事件的定義、觸發(fā)及處理相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • C#微信開發(fā)(服務(wù)器配置)

    C#微信開發(fā)(服務(wù)器配置)

    這篇文章主要介紹了C#微信開發(fā)中有關(guān)服務(wù)器配置的相關(guān)內(nèi)容,感興趣的小伙伴們可以參考一下
    2015-11-11
  • C#下實(shí)現(xiàn)創(chuàng)建和刪除目錄的實(shí)例代碼

    C#下實(shí)現(xiàn)創(chuàng)建和刪除目錄的實(shí)例代碼

    這篇文章主要介紹了C#下實(shí)現(xiàn)創(chuàng)建和刪除目錄的方法,功能非常實(shí)用,需要的朋友可以參考下
    2014-08-08
  • C#對(duì)JSON與對(duì)象的序列化與反序列化

    C#對(duì)JSON與對(duì)象的序列化與反序列化

    這篇文章介紹了C#對(duì)JSON與對(duì)象的序列化與反序列化,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C# 動(dòng)畫窗體(AnimateWindow)的小例子

    C# 動(dòng)畫窗體(AnimateWindow)的小例子

    C# 動(dòng)畫窗體(AnimateWindow)的小例子,需要的朋友可以參考一下
    2013-03-03
  • winform調(diào)用javascript的小例子

    winform調(diào)用javascript的小例子

    winform調(diào)用javascript的小例子,需要的朋友可以參考一下
    2013-05-05
  • C#連接數(shù)據(jù)庫的幾種方法

    C#連接數(shù)據(jù)庫的幾種方法

    這篇文章介紹了C#連接數(shù)據(jù)庫的幾種方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C# Task取消暫停的實(shí)現(xiàn)

    C# Task取消暫停的實(shí)現(xiàn)

    本文主要介紹了C# Task取消暫停的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • C# FileStream文件讀寫詳解

    C# FileStream文件讀寫詳解

    本文主要介紹C#使用 FileStream 讀取數(shù)據(jù),寫入數(shù)據(jù)等操作,希望能幫到大家。
    2016-04-04
  • c# 托盤雙擊不觸發(fā)單擊事件的實(shí)現(xiàn)方法

    c# 托盤雙擊不觸發(fā)單擊事件的實(shí)現(xiàn)方法

    在開發(fā)winform的時(shí)候我發(fā)現(xiàn),當(dāng)執(zhí)行雙擊操作(notifyIcon1_MouseDoubleClick)時(shí),會(huì)同時(shí)伴隨著單擊事件(notifyIcon1_MouseClick)的發(fā)生。。那如何才能使雙擊事件不觸發(fā)單擊事件呢?
    2009-02-02

最新評(píng)論

平利县| 荆州市| 额尔古纳市| 凤阳县| 平谷区| 金门县| 当雄县| 定西市| 禹州市| 永济市| 安乡县| 武宣县| 繁峙县| 辽中县| 洞头县| 福清市| 泉州市| 泰宁县| 烟台市| 邹平县| 定西市| 雷波县| 黔江区| 林州市| 漠河县| 栾城县| 广河县| 南丹县| 富顺县| 咸宁市| 习水县| 民县| 繁峙县| 海兴县| 富宁县| 门头沟区| 花莲市| 隆昌县| 尤溪县| 读书| 蒙山县|