深入理解計算機系統(六):進位間的轉換原理
來自專欄 Python程序員
目錄
1、進位的介紹
2、二進位轉換成其他進位
3、十進位轉換成其他進位
4、十六進位轉換成其他進位
5、總結
上一篇博客我們講解了信息的在計算機中是如何存儲以及如何表示的。但是對於各個進位的轉換隻是一筆帶過了,後來作者仔細研究了進位轉換的原理,發現還是挺有感悟的。那麼這篇博客就講講進位轉換。
正文:
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-5)10=(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…………13(D)
(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+7x160)10=(160+7)10=(167)10
例子2:將十六進位數(0.D4)16轉換成十進位數。
(0.D4)16=(0+13x16-1+4x16-2)10=(0+0.8125+0.015625)10=(0.828125)10
5、總結
①. 其他進位轉十進位:將二進位數、十六進位數的各位數字分別乘以各自基數的(N-1)次方,其相加之和便是相應的十進位數,這是按權相加法。
②. 十進位轉其他進位:整數部分用除基取余法,小數部分用乘基取整法,然後將整數與小數部分拼接成一個數作為轉換的最後結果。
③. 二進位轉十六進位:從小數點位置開始,整數部分向左,小數部分向右,每四位二進位為一組用一位十六進位的數字來表示,不足四位的用0補足。
④. 十六進位轉二進位:每一位十六進位對應每四位二進位,不足用0補足。
推薦閱讀:
※Scratchapixel舉步維艱,尋求贊助或投放廣告
※用表格思想理解資料庫存儲
※[數據結構]表達式樹——手動eval()
※個人感想:《On Lisp》和 《DSL》:lisp為什麼不流行?
※四步處理一個數據或元素的拖放