深入理解計算機系統(2.2)------進制間的轉換原理


  上一篇博客我們講解了信息的在計算機中是如何存儲以及如何表示的。但是對於各個進制的轉換 LZ 只是一筆帶過了,后來LZ仔細研究了進制轉換的原理,發現還是挺有感悟的。那么這篇博客就講講進制轉換。

 

1、進制的介紹

  在講進制之前,我們先看一下數制的定義:用一組固定的數字和一套統一的規則來表示數目的方法稱為數制。

  而數制有進位計數制與非進位計數制之分。非進位計數制的數碼表示的數值大小與它在數中的位置無關,這里我們不作過多的介紹。

  進位計數制的數碼所表示的數值大小則與它在數中所處的位置有關,常見的有二進制、十進制、十六進制,我們這里也只介紹這三種進制的轉換。

  進位計數制的要素:

    ①、數碼:用來表示進制數的元素。比如二進制數的數碼為:0,1。十進制數的數碼為:0,1,2,3,4,5,6,7,8,9。十六進制數的數碼為:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F

    ②、基數:數碼的個數。比如二進制數的基數為2。十進制數的基數為10。十六進制數的基數為 16.

    ③、位權:數制中每一固定位置對應的單位值稱為位權。例如十進制第2位的位權為10,第3位的位權為100;而二進制第2位的位權為2,第3位的位權為4,對於 N進制數,整數部分第 i位的位權為N^(i-1),而小數部分第j位的位權為N^-j。

  那么我們可以說:每個數碼所表示的數值=該數碼值 * 所處位置的位權。上面的內容概括起來可以看一下下面這張圖:

  

  比如十進制數:(123.45)10=1×102+2×101+3×100+4×10-1+5×10-2

    二進制數:(1010)2 =l× 23+0 × 22+l× 21+0 × 20=(10)10

   十六進制數:(BAD)16 =11× 162+10×161+13×160=(2989)10

 

2、二進制轉換成其他進制 

   ①、二進制(Binary)——>十進制(Decimal)

   訣竅:以小數點為界,整數位從最后一 位(從右向左)開始算,依次列為第0、1、2、3………n,然后將第n位的數(0或1)乘以2的n-1次方,然后相加即可得到整數位的十進制數;小數位則 從左向右開始算,依次列為第1、2、3……..n,然后將第n位的數(0或1)乘以2的-n次方,然后相加即可得到小數位的十進制數(按權相加法)。

   例子:將二進制數(10.10101)2轉化為十進制數。

   (10.10101)2=(1x21+0x20+1x2-1+0x2-2+1x2-3+0x2-4+1x2-510=(2+0+0.5+0+0.125+0+0.03125)10=(2.65625)10

 

   ②、二進制(Binary)——>十六進制(Hex)

   訣竅:因為每四位二進制數對應一位十六進制數,所以,以小數點為界,整數位則將二進制數從右向左每4位一隔開,不足4位的在左邊用0填補即可;小數位則將二進制數從左向右每4位一隔開,不足4位的在右邊用0填補即可。

   例子:將二進制數(10.10101)2轉化為十六進制數。

   (10.10101)2=(0010.1010 1000)2=(2.A8)16

  

3、十進制轉換成其他進制 

   ①、十進制(Decimal)——>二進制(Binary)

  訣竅:以小數點為界,整數部分除以2,然后取每次得到的商和余數,用商繼續和2相除,直到商小於2。然后把第一次得到的余數作為二進制的個位,第二次得到的余數作為二進制的十位,依次類推,最后一次得到的小於2的商作為二進制的最高位,這樣由商+余數組成的數字就是轉換后二進制的值(整數部分用除2取余法);小數部分則先乘2,然后獲得運算結果的整數部分,將結果中的小數部分再次乘2,直到小數部分為零。然后把第一次得到的整數部分作為二進制小數的最高位,后續的整數部分依次作為低位,這樣由各整數部分組成的數字就是轉化后二進制小數的值(小數部分用乘2取整法)。

  需要說明的是,有些十進制小數無法准確的用二進制進行表達,所以轉換時符合一定的精度即可,這也是為什么計算機的浮點數運算不准確的原因。

   例子1:將十進制數(93)10轉換成二進制數。

    93/2=46……….1

    46/2=23……….0

    23/2=11……….1

    11/2=5…………1

    5/2=2…………...1

    2/2=1……………0

  (93)10=(1011101)2

 

   例子2:將十進制數(0.3125)10轉換成二進制數。

    0.3125x2 = 0 . 625

    0.625x2 = 1 .25

    0.25x2 = 0 .5

    0.5x2 = 1 .0

  (0.3125)10=(0.0101)2

 

   ②、十進制(Decimal)——>十六進制(Hex)

  訣竅:方法同十進制轉化成二進制類似。以小數點為界,整數部分除以16,然后取每次得到的商和余數,用商繼續和16相除,直到商小於16。然后把第一次得到的余數作為十六進制的個位,第二次得到的余數作為十六進制的十位,依次類推,最后一次得到的小於16的商作為十六進制的最高位,這樣由商+余數組成的數字就是轉換后十六進制的值(整數部分用除16取余法); 小數部分則先乘16,然后獲得運算結果的整數部分,將結果中的小數部分再次乘16,直到小數部分為零。然后把第一次得到的整數部分作為十六進制小數的最高位,后續的整數部分依次作為低位,這樣由各整數部分組成的數字就是轉化后十六進制小數的值(小數部分用乘16取整法)。

   例子1:將十進制數(93)10轉換成十六進制數。

    93/16=5…………13D

   (93)10=(5D)16

 

  例子2: 將十進制數(0.3125)10轉換成十六進制數。

    0.3125x16 = 5 .0

   (0.3125)10=(0.5)16

 

 

4、十六進制轉換成其他進制

   ①、十六進制(Hex)——>二進制(Binary)

   訣竅:十六進制轉換成二進制與二進制轉換成十六進制相反。每一位十六進制數對應四位二進制數

   

  例子1:將十六進制數(A7)16轉換成二進制數。

  (A7)16=(A 7)16=(1010 0111)2=(10100111)2

  例子2:將十六進制數(0.D4)16轉換成二進制數。

  (0.D4)16=(0. D 4)16=(0. 1101 0100)2=(0.110101)2

 

   ②、十六進制(Hex)——>十進制(Decimal)

   訣竅:方法同二進制轉換成十進制類似。 小數點為界,整數位從最后一位(從右向左)開始算,依次列為第0、1、2、3………n,然后將第n位的數(0-9,A-F)乘以16的n-1次方,然后相 加即可得到整數位的十進制數;小數位則從左向右開始算,依次列為第1、2、3……..n,然后將第n位的數(0-9,A-F)乘以16的-n次方,然后相 加即可得到小數位的十進制數(按權相加法)。

   

  例子1:將十六進制數(A7)16轉換成十進制數。

  (A7)16=(10x161+7x16010=(160+7)10=(167)10

  例子2:將十六進制數(0.D4)16轉換成十進制數。

  (0.D4)16=(0+13x16-1+4x16-210=(0+0.8125+0.015625)10=(0.828125)10

 

5、總結

  ①. 其他進制轉十進制:將二進制數、十六進制數的各位數字分別乘以各自基數的(N-1)次方,其相加之和便是相應的十進制數,這是按權相加法

  ②. 十進制轉其他進制:整數部分用除基取余法,小數部分用乘基取整法,然后將整數與小數部分拼接成一個數作為轉換的最后結果。

  ③. 二進制轉十六進制:從小數點位置開始,整數部分向左,小數部分向右,每四位二進制為一組用一位十六進制的數字來表示,不足四位的用0補足。

  ④. 十六進制轉二進制:每一位十六進制對應每四位二進制,不足用0補足。

 


免責聲明!

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



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