十進位制與二進位制互相轉換指南
電腦科學概論最近在學這個。費了大概一星期的課餘時間來弄懂正負數、整數浮點、小數分數的互相轉換。寫出來,方便以後複習用。
基礎篇:二進位制簡介
二進位制轉十進位制:
與十進位制的滿十進一一樣,二進位制是滿二進一的。所以用二進位制表示的數與十進位制存在如下關係(以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)
十進位制轉二進位制:
- 這是我高中學的方法,也算是最笨的方法:使用短除法求餘。將數值一直除以2,直到商為0。第一個取出來的餘數是最靠近小數點的。
舉例:125
然後從下往上讀,得到1111101。即125(10)=1111101(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; 例:-6 寫出6的二進位制表示:0110; 全部取反:1001;
+1:1010同樣先寫出二進位制數,然後從右往左,將所有位的數字照抄下來,直到遇到第一個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…因此計算機是不可能精確地儲存這個數的,只能儲存一個近似值。這也是截斷錯誤的一種。
說好的方便複習,結果在期末考試前一晚才寫出來……
有錯請指出。
感謝觀看。
相關文章
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- JavaScript十進位制轉換為二進位制JavaScript
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- Qt進位制轉換(十進位制轉十六進位制)QT
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- 二進位制、十進位制與十六進位制相互轉化
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- 進位制與二進位制及相關轉換
- 二進位制轉十進位制快速方法
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- Python 十進位制轉換為二進位制 高位補零Python
- 十進位制轉二進位制推導(草稿)
- n進位制轉十進位制
- 十進位制轉十六進位制
- 遞迴函式實現十進位制正整數轉換為二進位制,八進位制,十六進位制遞迴函式
- 什麼是二進位制?二進位制如何轉換?
- [20190716]十進位制轉換其他進位制指令碼.txt指令碼
- 十進位制轉換任意進位制--鏈棧實現
- 十進位制——二 (八、十六 )進位制
- 3416:【例72.1】 二進位制轉化為十進位制
- Go語言實現十進位制轉換成二、八、十六進位制Go
- JavaScript 二進位制、八進位制與十六進位制JavaScript
- 二進位制與二進位制運算
- JavaScript中的多種進位制與進位制轉換JavaScript
- 進位制轉換
- 整數轉化成八進位制、十六進位制、二進位制,以及轉回
- oracle_16進位制與10進位制轉換小示例Oracle
- 進位制詳解:二進位制、八進位制和十六進位制
- WebSocket系列之JavaScript字串如何與二進位制資料間進行互相轉換WebJavaScript字串
- 二進位制補碼及與原碼的互相轉換方法詳解
- JavaScript 進位制轉換JavaScript
- 【python】進位制轉換Python
- 進位制的轉換
- 牛客網 二進位制數(進位制轉換、北郵機試)
- 口算 16 進位制轉換 10 進位制,但只適合兩位的 16 進位制