二進位製取反

2021-06-28 18:33:00 字數 2075 閱讀 9690

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

分析

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

最直接的方法

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

intv

=111

;intr =

v;ints =32

;for(;0

!=v;v

>>=1)

r <<=s;

system

.out

.println(r

);

**比較好理解,取到v的最低位,作為r的最高位;v每取一次最低位,則右移一位;r每確定一位,則左移一位。同時記錄移動了多少位,最終要補齊。

通過查表的方法

在遇到位操作的問題時,往往題目中限定了總的位數,比如這個題目,我們可以認為32位。這就給我們帶來了乙個以空間換時間的解決思路:查表法。位數是固定的,可以申請空間,儲存預先計算好的結果,在計算其他的結果的時候,則查表即可。

32位相對於查表來講,還是太大了。既然這樣縮小範圍,32個bit,也就是4個byte。每個byte 8bit,可以表示0-255的整數。可以通過申請256大小的陣列,儲存這256個整數,二進位制逆序之後的整數。然後將乙個32位的整數,劃分為4個byte,每乙個byte查表得到逆序的整數:r1,r2,r3,r4。按照r4r3r2r1順序拼接二進位制得到的結果就是最終的答案。

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

巧妙的方法

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

最後乙個2位的逆序,直接交換即可。也就是分治遞迴的終止條件。但是,在上面的過程中,還沒有應用到位操作的技巧。根據動態規劃的思想,我們可以自底向上的解決這個問題:

2組16位的交換,完成32位的逆序

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

0001

1011

0110

0001

0010

0111

1001

0000

0101

1010

1100

0101

1000

0100

0110

1100

0110

1101

1000

01經過4步,逆序完成。推而廣之,總的時間複雜度為o(logn),n是二進位制的位數。這個方法可以推廣到任意位。

示例**如下:

intv =

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

);

上面的思路理解了,**不難理解。例如第二行,前邊是取偶數字,後面是取奇數字,奇數字左移一位,偶數字右移一位,再取或,就是交換了奇數偶

二進位製取反運算

總結一下,有點疑惑。目錄 1 關於二進位制表示 1 正數補碼 2 負數補碼 3 取反運算 這裡有幾個概念,關於原碼 補碼和反碼 補碼 在計算機系統中,數值一律用補碼來表示 儲存 正數的補碼是其原碼。例如十進位制數8,其二進位制原碼表示為00001000,則其補碼即為0000 1000。最高位是符號位...

java二進位制正數和負數取反

反碼 取反 按位取反 這3個概念是不一樣的。取反 0變1,1變0 反碼 正數的反碼是其本身,對於負數其符號位不變其它各位取反 0變1,1變0 按位取反 這將是下面要討論的。要弄懂這個運算子的計算方法,首先必須明白二進位制數在記憶體中的存放形式,二進位制數在記憶體中是以補碼的形式存放的。另外正數和負數...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...