陳新龍
600,3/5,-7.99……這些數(shù)字都是十進制數(shù),因為人有十根手指頭,所以最常用的是十進制。十進制就是滿十進一,滿二十進二,以此類推……十進制數(shù)字按權(quán)展開,第一位權(quán)為10^0,第二位權(quán)為10^1……以此類推,第N位按權(quán)展開10^(N-1),該數(shù)的數(shù)值等于每位的數(shù)值乘該位對應(yīng)的權(quán)值之和。
在計算機的世界里除了十進制之外,常用的還有二進制、八進制、十六進制,今天我們就來講一講這個二進制。
二進制(binary)在數(shù)學(xué)和數(shù)字電路中指以2為基數(shù)的記數(shù)系統(tǒng)。這一系統(tǒng)中,通常用符號0和1來表示。數(shù)字電子電路中的高電位和低電位剛好符合二進制,因此現(xiàn)代的計算機和依賴計算機的設(shè)備中都用到二進制。每個數(shù)字稱為一個比特(BIT,Binary digit)。
那么日常使用的十進制數(shù)是怎樣轉(zhuǎn)換成計算機使用的二進制數(shù)呢?
我們先看一下0-10的二進制轉(zhuǎn)化十進制的對照表
例如:十進制10=二進制1010
按權(quán)展開:
1*2^3+0*2^2+1*2^1+0*2^0=10
例如:十進制9=二進制1001
按權(quán)展開:
1*2^3+0*2^2+0*2^1+1*2^0=9
初步知道了十進制和二進制的關(guān)系后,我們思考一下如何將十進制轉(zhuǎn)化為二進制呢?大家可以去網(wǎng)上查閱一下。
十進制整數(shù)轉(zhuǎn)換為二進制整數(shù):十進制整數(shù)轉(zhuǎn)換為二進制整數(shù)采用“除2取余,逆序排列”法。用2整除十進制整數(shù),可以得到一個商和余數(shù);再用2去除商,又會得到一個商和余數(shù),如此重復(fù),直到商為小于1時為止,然后把先得到的余數(shù)作為二進制數(shù)的低位有效位,后得到的余數(shù)作為二進制數(shù)的高位有效位,依次排列起來。這就是除二取余法。(圖1)
下面我們來分析將十進制正整數(shù)轉(zhuǎn)化為二進制的代碼。問題的核心是將“除2取余,逆序排列”轉(zhuǎn)化成可以執(zhí)行的代碼(圖2)。
設(shè)置了四個變量,“十進制”、“二進制”、“商”、“余數(shù)”。
特別要注意二進制賦值中為空,否則最后的結(jié)果會多一位小尾巴0。
將輸入的十進制數(shù)設(shè)為“商”。對它除以2取余數(shù),將這位“余數(shù)”存入“二進制”的個位,將“商”除以2向下取整存為下一次循環(huán)的“商”。這就是將“除2取余,逆序排列”的計算步驟轉(zhuǎn)化為編程的循環(huán)語句,一直處理到“商”=0為止。算出每次商除2的余數(shù),將余數(shù)和二進制的數(shù)合并。這樣結(jié)果就可以出來了。
十進制小數(shù)轉(zhuǎn)換成二進制小數(shù)方法與整數(shù)不同,要用“乘2取整,順序排列”法。用2乘十進制小數(shù),可以得到積,將積的整數(shù)部分取出,作為二進制小數(shù)的高位,再用2乘余下的小數(shù)部分,又得到一個積,再將積的整數(shù)部分取出,如此進行,直到積中的小數(shù)部分為零,或者達到所要求的精度為止。把取出的整數(shù)部分按順序排列起來,先取的整數(shù)為二進制小數(shù)的高位有效位,后取的整數(shù)作為低位有效位。
在計算機中將十進制小數(shù)轉(zhuǎn)換為二進制小數(shù)時,常常會出現(xiàn)無限循環(huán)的情況。由于計算機的內(nèi)存空間有限,只能保留有限的小數(shù)位。這時把二進制換回十進制就會出現(xiàn)誤差。
比如0.3轉(zhuǎn)換為二進制是0.010011001(1001循環(huán)),0.3轉(zhuǎn)為二進制再轉(zhuǎn)回十進制就變小了。
0.3≈0.010011001≈0.298828125
這種因存儲空間導(dǎo)致的精度問題是編程上常見的技術(shù)問題,吃透了進制轉(zhuǎn)換對您后續(xù)的編程學(xué)習(xí)有重要的意義。