十進位制與二進位制互相轉換指南

夜輪發表於2018-01-11

電腦科學概論最近在學這個。費了大概一星期的課餘時間來弄懂正負數、整數浮點、小數分數的互相轉換。寫出來,方便以後複習用。

基礎篇:二進位制簡介


二進位制轉十進位制:

與十進位制的滿十進一一樣,二進位制是滿二進一的。所以用二進位制表示的數與十進位制存在如下關係(以8位為例)(為了便於排版,用了豎排):
1 -> 128 = 27
1 -> 64 = 26
1 -> 32 = 25
1 -> 16 = 24
1 -> 8 = 23
1 -> 4 = 22
1 -> 2 = 21
1 -> 1 = 20
往上,以此類推。因此,只要用2的n次方乘以對應位的數字就行。
舉例:01001011(2)=0×27+1×26+0×25+0×24+1×23+0×22+1×21+1×20=75(10)

十進位制轉二進位制:

  1. 這是我高中學的方法,也算是最笨的方法:使用短除法求餘。將數值一直除以2,直到商為0。第一個取出來的餘數是最靠近小數點的。
    舉例:125
    這裡寫圖片描述
    然後從下往上讀,得到1111101。即125(10)=1111101(2)。
  2. 使用速算的方法。(大概是升級版?)
    由二進位制轉十進位制的方法可以推出該方法。記住低四位是8、4、2、1即可,其餘的可以往上推出 舉例:75 速算,得出75 = 64+16+4+1。與對應位的數字比較,得到75(10)=01001011(2)。

四則運算

二進位制滿二進一。因此以二進位制進行四則運算時存在如下規律:
0+0=0, 0+1=1, 1+0=1, 1+1=10. 0×0=0,
0×1=0, 1×0=0, 1×1=1.

進階篇:正負數、整數浮點、小數分數的轉換


補碼——正負數的轉換

明確一點:負整數在計算機中是以二進位制補碼(two’ s complement)的形式儲存的。為講解方便,下面的位長度均為4.
在負數的儲存中,最左邊的一位是符號位,負數的符號位為0,正數的符號位為1。因此,在位長度為4的條件下,3(10)=0011(2),-3(10)=1101(2)。

  1. 十進位制數求補碼的方式
    先將十進位制數轉換為二進位制數,然後全部取反,最後將所得的數+1; 例:-6 寫出6的二進位制表示:0110; 全部取反:1001;
    +1:1010

  2. 同樣先寫出二進位制數,然後從右往左,將所有位的數字照抄下來,直到遇到第一個1為止,最後將這個1前所有位數取反。
    例:-6
    寫出6的二進位制表示:0110;
    1前所有數字取反:10
    合併:1010

推薦第一種方法,不容易算錯。

二進位制數轉十進位制數的方法:

先看符號位,0為正數,1為負數。如果符號位是0,直接轉成十進位制數;如果符號位為1,將所有位取反然後+1;或從右往左照抄所有數字,直到遇到第一個1,然後將1前所有位數取反,最後轉成十進位制數。

溢位

溢位(overflow)是指在算數計算中,得出的數值大於系統能表示的最大值或小於最小值的情況。溢位會造成錯誤,有可能給計算機造成損害。
舉例說明。前面將位長度設為4,這樣的話計算機只能儲存從-8到7的整數。一旦我們計算的結果超過這個範圍,就會引發錯誤。如6+4,你以為答案是10,但計算機給出的結果是-6。原因很簡單,把6和4轉成二進位制再運算下:
0110+0100=1010=-6(10)
不過現在的計算機使用的位數比例子中的長得多,所以小數的運算大可不必擔心。

移碼

移碼的計算方法很簡單,將補碼的符號位取反即可。

小數(浮點數)的轉換


如無說明,位長度均為8位。
儲存小數時,一般第1位為符號位;第2~4位為指數位(使用移碼編碼);第5~8位為尾數位。
十進位制與二進位制在小數點後的關係如下:
1 -> 1 = 20
1 -> 1/2 = 2-1
1 -> 1/4 = 2-2
1 -> 1/8 = 2-3
如此類推。

二進位制轉十進位制

首先看符號位,0為正,1為負。接著看指數位,將指數位的數轉為補碼再判斷正負、代表的十進位制數是多少。最後看尾數位,按指數位的數字移動小數點(正往右,負往左),轉成十進位制數的最終結果。
例:01101011。
符號位為0,代表這個數是正數。指數位為110,轉成補碼為010,說明指數位的數字是2,之後處理小數點時要把小數點右移兩位。尾數位的數為1011,依照指數位的數移動後,數字變為10.11,轉成十進位制為2 3/4。
例2:00111100
符號位為0,代表這個數是正數。指數位為011,轉成補碼為111,說明指數位的數字是-1,小數點要左移一位。尾數位的數為1100,小數點移動後數字變為0.0011,轉成十進位制為3/8。

十進位制轉二進位制

先看符號位,0為正數,1為負數。接著將十進位制數直接轉成二進位制數。再將小數點移動至所有數字前面,計算移動的位數和方向,然後轉成補碼,最後合併,得到結果。

截斷

思考一下這個數字的轉換:3 3/8。如果依舊用8位的位長度,轉換成二進位制後,這個數是這樣的:01101101。
似乎哪裡不對。再轉回十進位制看看。
尾數位是1101,小數點右移兩位變為11.01,轉成十進位制是3 1/4。嗯?還有1/8去哪了?
這種位數丟失的情況就叫截斷(truncation)。
還有一種情況。假設程式要儲存1/3,而根據十進位制與二進位制的關係,計算機中只有1/2、1/4、1/8…因此計算機是不可能精確地儲存這個數的,只能儲存一個近似值。這也是截斷錯誤的一種。


說好的方便複習,結果在期末考試前一晚才寫出來……
有錯請指出。
感謝觀看。

相關文章