在編程工作種,我們時常需要對不同的進制的數進行轉換,以方便我們的工作、閱讀和理解。在計算機領域,主要設計二進制、八進制、十進制和十六進制,下面我們就來講講這四種機制的整數相互轉換方法。
一、查表法
就是我們制作一張包含各種進制的值一 一對應數值表,需要時查表就得,但是,我們知道,這不太現實,因為數是無窮的,我們不可能做一張無窮的表。在次但是,這也不是說查表法就不用了,其實我們一直在使用,你可能會說,沒有,沒見過,不對,有的,就在你的腦海里,我相信絕大部分程序員都有,比如,問你,(15)10對應的十六進制是多少,你肯定張口就答(F)16,為什么你能很快答出,是因為我們在日常工作和學習中,無形在腦海里建立了這張表。只是這張表很有限,更大的數你就不能一口答了,所以需要其他的轉換方法,但是其他方法會用到查表法。
我們至少要建立起如下的一張表
二、短除法
短除法運算方法是先用一個除數除以能被它除盡的一個質數,以此類推,除到商是質數為止。具體在我們的進制換算里,當一個M進制數轉N進制數時,就是用這個數除N取余,逆序排列。具體做法是:將N作為除數,用M進制整數除以N,可以得到一個商和余數;保留余數,用商繼續除以N,又得到一個新的商和余數;仍然保留余數,用商繼續除以N,還會得到一個新的商和余數;如此反復進行,每次都保留余數,用商接着除以N,直到商為0時為止
下面舉例:
- 十進制轉二進制、八進制、十六進制
(10)10--->(x)2
結果為(10)10--->(1010)2
(100)10--->(x)8
結果為(100)10--->(144)8 。
(100)10--->(x)16
結果為(100)10--->(64)16 - 八進制轉二進制、十進制、十六進制
(27)8--->(x)2
結果為(27)8--->(10111)2
(27)8--->(x)10
首先查表得 (10)10<===>(12)8
有如下算式
結果為(27)8--->(23)10
(756)8--->(x)16
首先查表得 (16)10<===>(20)8
(E)16<===>(16)8
有如下算式
結果,(756)8--->(1EE)16
二進制轉其他進制和十六進制轉其他進制我就不一一舉例了,通過上面的例子,我們可以看到用短除法我們是可以進行任意進制的相互轉換的,同時我們也可以發現,將高進制向低進制(只限於這幾種進制,我們姑且認為高低順序為:二進制<八進制<十進制<十六進制)轉換時,要先有一步進制基數的查表換算過程,在加上我們人對二、八、十六進制的四則運算不熟悉,所以這三種進制進行短除法換算比較困難。由於十進制的基數本身就是十六進制的數碼,同時代表的量意義也一樣,所以總的來說,短除法特別適合十進制向二、八、十六進制的轉換。
三、位權相加法
我們知道,任何進制的數都是由:位、數碼、位權等要素構成,這也為我們進制間的轉換提供了一種方法:位權相加法。假設當前數字是N進制,那么:對於整數,從右往左看,第i位的位權等於Ni-1。更加通俗的理解是,假設一個多位數(由多個數字組成的數)某位上的數字是1,那么它所表示的數值大小就是該位的位權。當我們由M進制轉為N進制時要進行這樣的運算:a*Ni-1+aNi-2+...+a*N1+a*N0。
下面舉例:
- 二進制轉十進制
轉換公式:a*2i-1+a*2i-2+...+a*21+a*20
(11001)2=1*24+1*23+0*22+0*21+1*20=(16+8+0+0+1)10=(25)10 - 八進制轉十進制
轉換公式:a*8i-1+a*8i-2+...+a*81+a*80
(145)8=1*82+4*81+5*80=(64+32+5)10=(101)10 - 十六進制轉十進制
轉換公式:a*16i-1+a*16i-2+...+a*161+a*160
(145)16=1*162+4*161+5*160=(256+64+5)10=(325)10 - 二進制轉八進制
由於兩個進制的基數存在着這樣的關系 8=23,也就是說3為二進制數正好是一位八進制數。所以只能是從低到高,按3位一組編組,高位不夠3位補0,在編組內用二進制轉十進制的公式
(11001)2=(011)2( 001)2=(0*22+1*21+1*20)(0*22+0*21+1*20)=(31)8 - 二進制轉十六進制
由於兩個進制的基數存在着這樣的關系 8=24,也就是說4為二進制數正好是一位十六進制數。所以只能是從低到高,按4位一組編組,高位不夠4位補0,在編組內用二進制轉十進制的公式
(11001)2=(0001)16( 1001)16=(0*23+0*22++0*21+1*20)(1*23+0*22++0*21+1*20)=(19)16
我們可以看到,位權相加法特別適合二、八、十六進制轉十進制,對其它情況則很困難,比如二進制轉八、十六進制時先用了合位法,特別是高進制轉低進制更是困難。
四、拆位拼接法
由於二進制、八進制和十六進制的基數有着這樣的關系:8=23,16=24,也就十說一位八進制數等於3位二進制數,一位十六進制數等於4位二進制數,所以有如下轉換方法。
- 八進制轉二進制
一位八進制數通過查表拆成三位二進制,然后按八進制數的高低位組合起來即可。如:
( 2743)8---->(x)2
先拆成:2 7 4 3,然后分別查表對應的二進制 010 111 100 011
然后拼接,結果為( 2743)8---->(010111100011)2 - 十六進制轉二進制
一位十六進制數通過查表拆成四位二進制,然后按十六進制數的高低位組合起來即可。如:
( A5D6)16---->(x)2
先拆成:A 5 D 6,然后分別查表對應的二進制 1010 0101 1101 0110
然后拼接,結果為( A5D6)16---->(1010010111010110)2
五、借橋法
對某些困難的情況,我們可以先轉位十進制或二進制,然后在轉為對應的進制,我成為借橋法,中間的進制就是橋。比如十六進制轉八進制,我們可以先用位權相加法轉為十進制,在用短除法轉為八進制。這就不舉例了。
六、總結
- 短除法和位權相加法都能進行這四種進制的相互轉換,只是在某些情況下較困難
- 十進制轉二、八、十六進制時最好用短除法
- 二、八、十六進制轉十進制時最好用位權相加法
- 二進制轉八、十六進制最好用合位法和位權相加法
- 八、十六進制二轉進制最好用拆位拼接法
- 八進制和十六進制的互相轉換最好用用借橋法