在數學計算中,二進制計數系統的公分母是最小的,它以2爲基數。你還記得在小學或中學時所學的不一樣的計數系統嗎?筆者在上小學時,曾在一堂數學課中學過以6爲基數的計數系統;你先數1,2,3,4,5,而後是10,11,12,13,14,15,而後是20,等等,實際上,應該先數0,1,2,3,4,5,而後是10,1l,12,13,14,15,等等。從O開始數,能比較清楚地看出每6個數字組成一組——所以6就是基數。注意,你應該從O開始一塊兒數到比基數小1的數(由於基數是6,因此你應該從O數到5)。當你數到5後,接着應該開始數兩位數。若是你思考一下,你就會發現這與以10爲基數(十進制)的計數系統是相似的——在你數到比基數小1的數(9)後,就轉到兩位數,並繼續往下數。
計算機中的計數系統以2爲基數——即二進制。因爲以2爲基數,因此你先數O,1,而後是10,11,而後是100,101,110,111,而後是1000,1001,1010,1011,1100,1101,1110,1111,等等。與以6爲基數時不一樣,在以2爲基數時,在數到兩位數以前,只需從O數到1。
那麼,爲何在計算機中要以2爲基數呢?其緣由在於計算機中使用了晶體管。晶體管使現代計算機的出現成爲可能。晶體管就象電燈開關,電燈開關有「開」和「關」兩種狀態,晶體管也是如此。你能夠認爲「關」表示0,「開」表示1,這樣,你就能夠用一個晶體管(若是你願意,也能夠用一個電燈開關)來進行從。到1的計數了。僅僅使用兩個數字(O到1)還不能作任何複雜的計算,可是咱們還能夠繼續下去。假設有一個電燈開關控制面板,上面有4個大電燈開關,儘管每一個開關只有兩種狀態,可是這些開關組合起來就會有16或2。(4個開關,每一個2種狀態)種不一樣的狀態。這樣,你就能夠用4個開關來進行從。到15的計數了,見表20.22。
表20.22 進制計數
-------------------------------------------------------
開關 十進制值 冪
-------------------------------------------------------
O O
1 1 20
10 2 21
11 3
100 4 22
101 5
110 6
111 7
1000 8 23
1001 9
1010 10
1011 11
1100 12
1101 13
1110 14
1111 15
-------------------------------------------------------
上表說明了很重要的三點:
經過把開關並排放在一塊兒,你就能夠用它們來計數了——在本例中最多能夠數到15(總共16次計數);
你能夠把每一個開關看做是一個二進制位,就象十進制系統中的十進制位同樣;
若是每一個開關都表明一個二進制位,那麼它們恰好也都表明一個2的冪(20,21,22,23,等等)。
此外,請注意,在表中出現2的冪的地方,計數結果就要增長一個二進制位。這與十進制系統是相同的,每增長一個十進制位時,這個新的十進制位也正是一個10的冪(1=100,10=101,100=102,等等)。明白了這一點後,你就能夠很容易地把二進制數轉換爲十進制數了,例如,二進制數10111就是(1×24)+(O×23)+(1×22)+(1×21)+(1×20),它等於十進制的(16+0+4+2+1)或23。10 1110 1011,一個大得多的二進制數,就是(1×29)+(O×28)+(1×27)+(1×26)+(1×25)+(0×24)+(1×23)+(O×22)+(1×21)+(1×20),它等於十進制的(512+0+128+64+32+0+8+0+2+1)或747。
那麼全部這些和咱們有什麼關係呢?在計算機領域中,存在着位(bit),半字節(nibble)和字節(byte)。一個半字節是4位,一個字節是8位。什麼是一個位呢?它就是一個晶體管。所以,一個字節就是8個相鄰的晶體管,就象表20.1中的4個開關同樣。記住,若是你有4個組合在一塊兒的開關(或晶體管),你就能夠數24或16,你能夠把這看做是由開關組成的一個半字節。若是一個半字節是4個晶體管組合在一塊兒,那麼一個字節就是8個晶體管組合在一塊兒。你能夠用8個晶體管數到2。或256,從另外一個角度看,這意味着一個字節(含8個晶體管)能夠表示256個不一樣的數字(從0到 255)。再深刻一點,Intel 386,486和Pentium處理器被叫作32位處理器,這意味着這些Intel芯片所進行的每一次運算都是32位寬或32個晶體管寬的。32個晶體管,或32位,等價於232或4,294,967,296,即它們能表示超過40億個不一樣的數字。
固然,上述介紹還不能解釋計算機是如何利用這些數字產生那種神奇的計算能力的,但它至少解釋了計算機爲何要使用以及是如何使用二進制計數系統的。
什麼是八進制?
八進制是以8爲基數的一種計數系統。在八進制系統中,你是這樣計數的:O,1,2,3,4,5,6,7,10,ll,12,13,等等。下面比較了八進制(第二行)和十進制(第一行)中的計數過程:
O,l,2,3,4,5,6,7,8,9,10.11,12,13,14,15,16
0,1,2.3,4,5,6,7,10,11,12,13,14,15,16,17,20
注意,在八進制中,在數到7後,就要增長一個八進制位,第二個八進制位顯然就是8?(等於十進制的8)。若是你數到第三個八進制位(八進制的100),那將是8?或十進制的64,所以,八進制的100等於十進制的64。
如今,八進制已經不象之前那樣經常使用了,這主要是由於如今的計算機使用的是8,16,32或64位處理器,最適合它們的計數系統是二進制或十六進制(見20.24中有關十六進制計數系統的介紹)
C語言支持八進制字符集,這種字符要用反斜槓字符來標識。例如,在C程序中,下面的語句並很多見:
if(x=='\007')break;
這裏的"\007"剛好就是ASCII值爲7的字符;該語句用來檢查終端鳴笛字符。另外一個常見的八進制數是"\033",即Escape字符(在程序中它一般表示爲"\033")。然而,八進制數如今已經不多見了——它們被十六進制數代替了。
什麼是十六進制?
十六進制(hexadecimal,縮寫爲hex)是以16爲基數的計數系統,它是計算機中最經常使用的計數系統。十六進制中的計數過程爲:O,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F,等等。十六進制中的字母是幾個單位數標識符,表示十進制的10到15。要記住在不一樣基數下的計數規則,即從O數到比基數小1的數字,在十六進制中這個數就是十進制的15。由於西式數字中沒有表示大於9的單位數,因此就用A,B,c,D,E和F來表示十進制的10到15。在十六進制中,數到F以後,就要轉到兩位數上,也就是1OH或Ox1O。下面對十六進制(第二行)和十進制(第一行)的計數過程做一下比較:
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,……
1,2,3,4,5,6,7,8,9,A, B, C, D, E, F, 10,……
注意,十進制的10等於十六進制的A。與前面討論過的計數系統同樣,每增長一個十六進制位,實際上就增長了一個16的冪,即160(1),161(16),162(256),163(4096),等等。所以,十六進制數3F能夠展開爲(3×161)+(F×160),等於十進制的(48+15)或63;十六進制數13F能夠展開爲(1×162)+(3×161)+(F×160),等於十進制的(256+48+15)或319。在c程序中,這兩個數用0x3F或Oxl3F這樣的形式來表示,其中的「0x」前綴用來告訴編譯程序(和程序員)該數字應被看成十六進制數來處理。若是不加「0x」前綴,你就沒法判斷一個數到底是十六進制數仍是十進制數(或者是八進制數)。
對錶20.22稍做改進,加入十六進制的計數過程,就獲得了表20.24:
—————————————————————————————————
二進制 十進制值 二進制冪 十六進制 十六進制冪
—————————————————————————————————
0000 O O
0001 1 20 1 160
0010 2 21 2
0011 3 3
0100 4 22 4
0101 5 5
0110 6 6
0111 7 7
1000 8 23 8
1001 9 9
1010 10 A
1011 11 B
1100 12 C
1101 13 D
1110 14 E
1111 15 F
10000 16 24 10 161 ————————————————————————————————— 筆者在上表的最後又加了一行,使計數達到十進制的16。經過比較二進制、十進制和十六進制·你就會發現:「十」在二進制中是「1010」,在十進制中是「10」,在十六進制中是「A」;。。十六」在二進制中是「1 0000"或「10000」,在十進制中是「16」,在十六進制中是「1O」,,(見上表的最後一行)。這意味着什麼呢?由於今天的16,32和64位處理器的位寬剛好都是16的倍數,因此在這些類型的計算機中用十六進制做爲計數系統是很是合適的。 十六進制位和二進位之間有一種「倍數」關係。在上表的最後一行中,二進制值被分爲兩部分(1 0000)。4個二進制位(或者4位)能夠計數到15(包括O在內共16個不一樣的數字),而4位(bit)正好等於一個半字節(nibble)。在上表中你還能夠發現,一個十六進制位一樣能夠計數到15(包括。在內共l 6個不一樣的數字),所以,一個十六進制位能夠表明4個二進制位。一個很好的例子就是用二進制表示十進制的15和16,在二進制中,十進制的15就是1111,正好是4個二進制位能表示的最大數字;在十六進制中,十進制的15就是F,也正好是一個十六進制位能表示的最大數字。十進制的16要用5個二進制位(1 0000)或兩個十六進制位(10)來表示。下面把前文提到過的兩個數字(0x3F和0x13F)轉換爲二進制: 3F 111111 l3F 100111111 若是把前面的空格換爲O,而且把二進制位分紅4位一組,那麼看起來就會清楚一些: 3F 0 0011 1111 l3F 1 0011 1111 你並不必定要把二進制位分紅4位一組,只不過當你明白了4個二進制位等價於一個十六進制位後,計數就更容易了。爲了證實上述兩組數字是相等的,能夠把二進制值轉換爲十進制值(十六進制值到十進制值的轉換已經在前文中介紹過了);二進制的111111就是(1×25)+(1×24)+(1×23)+(1×22)+(1×21)+(1×20),等於十進制的(32+16+8+4+2+1)或63,與0x3F的轉換結果相同。二進制的1 0011 1111就是(1×28)+(O×27)+(0×26)+(1×25)+(1×24)+(1×23)+(1×22)++(1×21)+(1×20),等於十進制的(256+32+1 6+8+4+2+1)或319。所以,十六進制和二進制能象手掌和手套那樣相互匹配。