欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c#二進制逆序方法詳解

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

原題

一個整數(shù),可以表示為二進制的形式,請給出盡可能多的方法對二進制進行逆序操作。 例如:10000110 11011000的逆序為 00011011 01100001

分析

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

最直接的方法

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

復制代碼 代碼如下:

直接的方法,很容易想到:有如下代碼: 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ù),比如這個題目,我們可以認為32位。這就給我們帶來了一個以空間換時間的解決思路:查表法。位數(shù)是固定的,可以申請空間,存儲預先計算好的結(jié)果,在計算其他的結(jié)果的時候,則查表即可。

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

這是一個思路,大家可以進一步思考,嘗試。

巧妙的方法

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

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

•每2位為一組,進行交換,完成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步,逆序完成。推而廣之,總的時間復雜度為O(logn),n是二進制的位數(shù)。這個方法可以推廣到任意位。

示例代碼如下:

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ù)位。也就是第一個步驟。

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

【分析完畢】

相關(guān)文章

  • C#?WPF?ListBox?動態(tài)顯示圖片功能

    C#?WPF?ListBox?動態(tài)顯示圖片功能

    這篇文章主要介紹了C#?WPF?ListBox?動態(tài)顯示圖片,處理過程分為前臺代碼和后臺代碼,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • C#如何操作Excel數(shù)據(jù)透視表

    C#如何操作Excel數(shù)據(jù)透視表

    這篇文章主要為大家詳細介紹了C#如何操作Excel數(shù)據(jù)透視表, 創(chuàng)建透視表、設置行折疊、展開等操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • C#將Word或Excel文檔轉(zhuǎn)換為Html文件

    C#將Word或Excel文檔轉(zhuǎn)換為Html文件

    這篇文章介紹了C#將Word或Excel文檔轉(zhuǎn)換為Html文件的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#設置軟件開機自動運行的方法(修改注冊表)

    C#設置軟件開機自動運行的方法(修改注冊表)

    這篇文章主要介紹了C#設置軟件開機自動運行的方法,通過簡單修改注冊表開機啟動項實現(xiàn)軟件的開機啟動功能,非常簡單實用,需要的朋友可以參考下
    2016-06-06
  • Unity實現(xiàn)簡單的虛擬搖桿

    Unity實現(xiàn)簡單的虛擬搖桿

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)簡單的虛擬搖桿,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#通過反射創(chuàng)建自定義泛型

    C#通過反射創(chuàng)建自定義泛型

    這篇文章主要介紹了C#通過反射創(chuàng)建自定義泛型的方法,需要的朋友可以參考下
    2014-08-08
  • C#實現(xiàn)公式計算驗證碼的示例詳解

    C#實現(xiàn)公式計算驗證碼的示例詳解

    現(xiàn)在很多的平臺已經(jīng)不使用普通的數(shù)字、字母等驗證碼了,取而代之的是拼圖類、選圖類、旋轉(zhuǎn)類或者計算類的驗證碼。本文將利用C#實現(xiàn)一個公式計算驗證碼,感興趣的可以了解一下
    2022-10-10
  • C#數(shù)據(jù)結(jié)構(gòu)之單鏈表(LinkList)實例詳解

    C#數(shù)據(jù)結(jié)構(gòu)之單鏈表(LinkList)實例詳解

    這篇文章主要介紹了C#數(shù)據(jù)結(jié)構(gòu)之單鏈表(LinkList)實現(xiàn)方法,結(jié)合實例形式較為詳細的分析了單鏈表的原理、定義與C#具體實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • C#中如何使用redis

    C#中如何使用redis

    這篇文章主要介紹了C#中如何使用redis,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • C#數(shù)值轉(zhuǎn)換-隱式數(shù)值轉(zhuǎn)換表參考

    C#數(shù)值轉(zhuǎn)換-隱式數(shù)值轉(zhuǎn)換表參考

    隱式轉(zhuǎn)換就是直接使用,比如可以把一個 byte 類型直接用在 int 上
    2013-04-04

最新評論