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