二進制、八進制、十進制、十六進制的互相轉換


在編程工作種,我們時常需要對不同的進制的數進行轉換,以方便我們的工作、閱讀和理解。在計算機領域,主要設計二進制、八進制、十進制和十六進制,下面我們就來講講這四種機制的整數相互轉換方法。

一、查表法

就是我們制作一張包含各種進制的值一 一對應數值表,需要時查表就得,但是,我們知道,這不太現實,因為數是無窮的,我們不可能做一張無窮的表。在次但是,這也不是說查表法就不用了,其實我們一直在使用,你可能會說,沒有,沒見過,不對,有的,就在你的腦海里,我相信絕大部分程序員都有,比如,問你,(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

     

五、借橋法

對某些困難的情況,我們可以先轉位十進制或二進制,然后在轉為對應的進制,我成為借橋法,中間的進制就是橋。比如十六進制轉八進制,我們可以先用位權相加法轉為十進制,在用短除法轉為八進制。這就不舉例了。

六、總結

  • 短除法和位權相加法都能進行這四種進制的相互轉換,只是在某些情況下較困難
  • 十進制轉二、八、十六進制時最好用短除法
  • 二、八、十六進制轉十進制時最好用位權相加法
  • 二進制轉八、十六進制最好用合位法和位權相加法
  • 八、十六進制二轉進制最好用拆位拼接法
  • 八進制和十六進制的互相轉換最好用用借橋法

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM