講計算機編碼,首先必須得講講二進位。二進位是什麼,計算機為什麼採用二進位,接下來我們就回答這兩個問題來聊一聊計算機中的二進位。
什麼是二進位,我們這樣來講。我們知道古代的長城,兩個烽火臺是用點狼煙來通知敵人來了。但是假設現在他們不光要知道有敵人來,還想知道來了多少敵人,由此他們想了兩個方法:
1、點火,滅火;點火,滅火;……,如此點了多少次,就表示有多少個敵人來了;
2、有多少敵人,就同時點多少堆火。
可是不管這兩種方法中的哪一種,幾個敵人好說,如果幾十個,上百個,甚至上千個時,都有麻煩。用第一種方法,有可能點火滅火還沒通知完,敵人就攻上來了;第二種方法,這個烽火臺得要多大的地方才夠呀。
那怎麼辦呢?後來他們想了個辦法,把幾堆柴禾(柴堆足夠大,確保對方能夠看到)按順序一字排開後,每個位置的柴堆點火來表示不同的敵人數,假設如下方表格中的三堆柴禾,每堆柴禾的滅火狀態表示為0,點火狀態表示為1,他們進行了這樣的約定:
0
沒有火堆被點著,表示沒有敵人來
1
點第一堆火,表示有1個敵人來了
2
點第二堆火,表示有2個敵人來了
3
點第一堆和第二堆火,表示有3個敵人來了
4
點第三堆火,表示有4個敵人來了
5
點第三堆和第一堆火,表示有5個敵人來了
6
點第三堆和第二堆火,表示有6個敵人來了
7
把三堆火同時點著,表示有7個敵人來了
所以這樣一來,用三堆柴禾就可以最大表示出8個狀態,可以表達的最大敵人數為7,以此類推,4堆火可以表示出16個狀態,可以表達的最大敵人數為15。如下圖:
0000
0
1000
8
0001
1
1001
9
0010
2
1010
10
0011
3
1011
11
0100
4
1100
12
0101
5
1101
13
0110
6
1110
14
0111
7
1111
15
再以此類推,5堆火,可以表示出32個狀態;6堆火,可以表示64個狀態了……。我們算下,如果有16堆火的時候,可以表示出幾個狀態呢?大家可能已經找到規律了:
3堆火,8個狀態:23 = 8
4堆火,16個狀態:24 = 16
5堆火,32個狀態:25 = 32
所以:
16堆火,總共可以有:216 =65536個狀態
也就是說如果我們一字排開16堆柴禾,如果 65535(65535=65536-1)個之內的敵人來的時候,我們都可以用這16堆柴禾給表達出來。
當然啦,如上方表格中,16個狀態的柴堆點火可不是隨機點的,兩個烽火臺,他們為了能快速知道多少敵人時點哪幾個柴堆,那麼一定需要有規律。我們來觀察一下上述表格:
狀態3 = 狀態2 + 狀態1
即: 11 = 10 + 01
狀態7 = 狀態6 + 狀態1 = 狀態5 + 狀態2
即: 111 = 110 + 001 = 101 + 010
而當狀態3 + 狀態1時,是否是狀態4呢?
所以當我們用0和1表示數據時,如果進位規則是逢二進一,那麼11+01 = 100,100即是狀態4。其實這就是二進位啦。由以上敘述可知,二進位數據即是指用0和1兩個符號來表示的數,且進位規則是逢二進一。
(1)技術實現簡單:計算機是由邏輯電路組成,邏輯電路通常只有兩個狀態,電路的接通與斷開,這兩種狀態正好可以用「1」和「0」表示。
(2)運算規則簡易:兩個二進位數和、積運算組合各有四種,運算規則簡單,有利於簡化計算機運算器的硬體結構。假如採用十進位,十進位的九九乘法就有55條公式,而二進位的乘法就四條規則:0×0=0、1×0=0、0×1=0、1×1=1。
(3)適合邏輯運算:二進位的0和1正好和邏輯代碼假和真相對應,有邏輯代數的理論依據,用二進位表示真和假的二值邏輯很自然。
(4)易於進行轉換,二進位與十進位數易於互相轉換。這個轉換有興趣的朋友自行搜索啦,不再這裡細述了。
(5)用二進位表示數據具有抗幹擾能力強,可靠性高等優點。因為每位數據只有高低兩個狀態,或開關,或通斷,所以即使受到一定的幹擾時,仍能可靠地分辨出它是高是低,是開是關,是通是斷。
我們來假設一下,因某一個烽火臺比較小,它同時放不下16堆火,只能生1堆火,但是敵人數量又有可能達到上萬人,那怎麼傳遞信息呢?可能有人已經想到了,我們可以用1堆火,比如約定10秒鐘生滅一次,然後:
第一個10秒生滅了一次,表示為1;
第二個10秒沒有點火,一直是滅,表示為0;
……
以此類推,160秒內,以開始到最後分別哪幾個10秒內生火了,將這16個狀態依次記錄下來,我們就得到了一個16位的二進位數據了。
同時16堆火來表示一個數據的表示法,我們稱之為並行。而隔10秒生滅一次火的方式來表達數據,我們稱之為串行。由以上舉例我們可知,並行的數據表示方法顯然速度更快。
在計算機系統裡,表達數據寬度的最小單位是「位」,即故事中的「一堆火」,如果同時能生16堆火,則表示數據寬度是16位的。平時我們說計算機是64位的,即可以並行處理64位數據,可表達的最大數據為:
264 - 1 =18,446,744,073,709,551,615
64位數據,有時我們也會表達為8個字節,即8個位(bit)構成一個字節(byte):
1byte (字節)= 8 bit(位)
byte可簡寫為大寫的「B」,bit可簡寫為小寫的「b」。另外:
1 KB (1千字節)= 210 B= 1024 B(字節)
1 MB (1兆字節)= 210 KB= 1024 KB
1 GB (1 G字節)= 210 MB= 1024 MB
1 TB (1 T字節)= 210 GB= 1024 GB
由這組等式,大家可能已經知道了各類段子裡的1024出於何處了,沒錯,計算機系統中的「1千」是1024,而不是1000,就是因為其數據是二進位表達的緣故:
210= 1024,即10位寬度的二進位數據1 111 111 111。
通過上面的敘述我們已經知道計算機中的數據是怎麼表達的,這裡可能有人有疑問了,那計算機上的字符又是如何來表示的呢,或者有人可能會問什麼是字符?在接下來,我們會慢慢展開來講計算機中的各類字符表達,會先講鍵盤上的這些字符,靜待下篇:計算機編碼|ASCII編碼。