2. 不同進制之間的換算

在十進制中,個位的1代表100=1,十位的1代表101=10,百位的1代表102=100,所以

123=1×102+2×101+3×100

同樣道理,在二進制中,個位的1代表20=1,十位的1代表21=2,百位的1代表22=4,所以

(A3A2A1A0)2=A3×23+A2×22+A1×21+A0×20

如果二進制和十進制數出現在同一個等式中,為了區別我們用(A3A2A1A0)2這種形式表示A3A2A1A0是二進制數,每個數字只能是0或1,其它沒有套括號加下標的數仍表示十進制數。對於(A3A2A1A0)2這樣一個二進制數,最左邊的A3位稱為最高位(MSB,Most Significant Bit),最右邊的A0位稱為最低位(LSB,Least Significant Bit)。以後我們遵循這樣的慣例:LSB稱為第0位而不是第1位,所以如果一個數是32位的,則MSB是第31位。上式就是從二進制到十進制的換算公式。作為練習,請讀者算一下(1011)2和(1111)2換算成十進制分別是多少。

下面來看十進制怎麼換算成二進制。我們知道

13=1×23+1×22+0×21+1×20

所以13換算成二進制應該是(1101)2。問題是怎麼把13分解成等號右邊的形式呢?注意到等號右邊可以寫成

13=((((0×2+13)×2+12)×2+01)×2+10

我們將13反覆除以2取餘數就可以提取出上式中的1101四個數字,為了讓讀者更容易看清楚是哪個1和哪個0,上式和下式中對應的數字都加了下標:

13÷2=6...10
6÷2=3...01
3÷2=1...12
1÷2=0...13

把這四步得到的餘數按相反的順序排列就是13的二進製表示,因此這種方法稱為除二反序取余法。

計算機用二進製表示數,程序員也必須習慣使用二進制,但二進制寫起來太囉嗦了,所以通常將二進制數分成每三位一組或者每四位一組,每組用一個數字表示。比如把(10110010)2從最低位開始每三位分成一組,10、110、010,然後把每組寫成一個十進制數字,就是(262)8,這樣每一位數字的取值範圍是0~7,逢八進一,稱為八進制(Octal)。類似地,把(10110010)2分成每四位一組,1011、0010,然後把每組寫成一個數字,這個數的低位是2,高位已經大於9了,我們規定用字母A~F表示10~15,這個數可以寫成(B2)16,每一位數字的取值範圍是0~F,逢十六進一,稱為十六進制(Hexadecimal)。所以,八進制和十六進制是程序員為了書寫二進制方便而發明的簡便寫法,好比草書和正楷的關係一樣。

習題

1、二進制小數可以這樣定義:

(0.A1A2A3...)2=A1×2-1+A2×2-2+A3×2-3+...

這個定義同時也是從二進制小數到十進制小數的換算公式。從本節講的十進制轉二進制的推導過程出發類比一下,十進制小數換算成二進制小數應該怎麼算?

2、再類比一下,八進制(或十六進制)與十進制之間如何相互換算?