十進位制與二進位制互相轉換指南
電腦科學概論最近在學這個。費了大概一星期的課餘時間來弄懂正負數、整數浮點、小數分數的互相轉換。寫出來,方便以後複習用。
基礎篇:二進位制簡介
二進位制轉十進位制:
與十進位制的滿十進一一樣,二進位制是滿二進一的。所以用二進位制表示的數與十進位制存在如下關係(以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…因此計算機是不可能精確地儲存這個數的,只能儲存一個近似值。這也是截斷錯誤的一種。
說好的方便複習,結果在期末考試前一晚才寫出來……
有錯請指出。
感謝觀看。
相關文章
- Python 進位制互相轉換(二進位制、十進位制和十六進位制)Python
- Oracle二進位制與十進位制轉換Oracle
- ORACLE使用函式對二進位制、十進位制、十六進位制數互相轉換Oracle函式
- 【進位制轉換】十進位制與十六進位制相互轉換方法
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 用C#程式碼實現二進位制與十進位制的互相轉換C#
- JavaScript十進位制轉換為二進位制JavaScript
- 二進位制轉十進位制快速轉換方法
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- 二進位制、十進位制與十六進位制相互轉化
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- Qt進位制轉換(十進位制轉十六進位制)QT
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 大話二進位制,八進位制,十進位制,十六進位制之間的轉換
- JavaScript 二進位制數字轉換為十進位制JavaScript
- js二進位制和十進位制轉換程式碼JS
- 十六進位制轉換為十進位制
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- python進位制轉換(二進位制、十進位制和十六進位制)及注意事項Python
- Oracle中的二進位制、八進位制、十進位制、十六進位制相互轉換函式Oracle函式
- (轉)【iOS 開發】二進位制、十進位制、十六進位制相互轉換的方法iOS
- 【轉帖】Oracle中的二進位制、八進位制、十進位制、十六進位制相互轉換函式Oracle函式
- 二進位制轉十進位制快速方法
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- Oracle中十進位制與十六進位制轉換程式Oracle
- 進位制與二進位制及相關轉換
- javascript十進位制數字和二進位制相互轉換JavaScript
- 十進位制轉二進位制推導(草稿)
- 1474 十進位制轉m進位制+1475 m進位制轉十進位制
- Python 十進位制轉換為二進位制 高位補零Python
- n進位制轉十進位制
- 十進位制轉十六進位制
- 十進位制轉換為十六進位制和二進位制程式碼例項
- 十進位制——二 (八、十六 )進位制
- 遞迴函式實現十進位制正整數轉換為二進位制,八進位制,十六進位制遞迴函式