位元、位元組以及K, M, G, T

現代的電腦使用了二進位數字系統作為其基本的計量單位,為什麼是二進位呢?那麼什麼又是位元bit、位元組Byte呢?KB、MB、GB、TB又分別代表什麼意思呢?

為什麼是二進位Binary?

其實最簡單的原因,電腦是由複雜的電路所構成的,由於類比的訊號在儲存以及傳輸並不太容易,所以就想要使用開關來控制電路上的電壓,當某一個點有量測到電壓時,就把它當做是其中一個狀態,記得1或是True(真值),而沒有量測到電壓時就把它當做是另外一個狀態 ,記為0或是False(假值)。之後,只要是用來處理、儲存、或是傳輸的數值或是文字,都是由這些狀態的組合來加以表示,就可以把任何的資料都簡化為最終的這兩種型式,此方式則為二進位的系統,而最基本的0或是1的單位,就把它叫做bit,中文譯為「位元」。

沒電-->0-->False-->假值

有電-->1-->True-->真值

使用二進位來表示數字

一個位元可以表示0或是1,如果把它當為數字的話,就只可以表示2個數字,那就是0以及1。那麼,想要表示更大一點的數字,就要用更多一點的二進位符號,也就是更多一點位元。因此,如果使用2個二進位符號,就可以表示00, 01, 10, 11等4個數字,轉換成我們生活中使用的10進位,那就可以說是00代表0、01代表1、10代表2、11代表3。

那同學們知道為什麼我們生活中使用的都是10進位嗎?

如果是3位數的二進位符號,表示成數字又分別是什麼呢?

000 -> 0
001 -> 1
010 -> 2
011 -> 3
100 -> 4
101 -> 5
110 -> 6
111 -> 7

又4位數的二進位符號呢?

0000 -> 0
0001 -> 1
0010 -> 2
0011 -> 3
0100 -> 4
0101 -> 5
0110 -> 6
0111 -> 7
1000 -> 8
1001 -> 9
1010 -> 10
1011 -> 11
1100 -> 12
1101 -> 13
1110 -> 14
1111 -> 15

答案是0到15。同學們會自行計算了嗎?

不過以上是用來表示正數的例子,如果想要正負數都拿來表示呢?其實有許多種表示的方法,其實一種方法最為簡單(但是最不常用,在這裡我們就不多加細究了),那就是把最左邊的那個位元拿來做正負號的判別,當是0的時候就是正數,如果是1個時候就是負數。以4位元的例子來看,如下:

0000 -> 0
0001 -> 1
0010 -> 2
0011 -> 3
0100 -> 4
0101 -> 5
0110 -> 6
0111 -> 7
1000 -> 0
1001 -> -1
1010 -> -2
1011 -> -3
1100 -> -4
1101 -> -5
1110 -> -6
1111 -> -7

相信同學們應該知道為什麼此種表示法並不常用的原因了吧?!

廣義上來說,要幾進位都是可以的。

同學們可以進一步的想想,為什麼在電腦的世界中,除了二進位之外,也常常會看到八進位和十六進位?

從前面的說明可以知道,我們可以用2的幾次方的方式計算出每一個二進位數字所代表的值

0110=>023+122+121+020=60110 => 0*2^3+1*2^2+1*2^1+0*2^0 = 6

十六進位的符號,分別是:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

八進位的符號則是:0, 1, 2, 3, 4, 5, 6, 7

有了上述的式子,同學們會自行轉換十進位和二進位數字了嗎?簡單的算法就是,把拿到的二進位數字從右到左開始乘以2的次方就可以了,標準式如下:

binary=bnbn1...b2b1b0decimal=b020+b121+b222+...+bn12n1+bn2nbinary = b_nb_{n-1}...b_2b_1b_0\\decimal = b_0*2^0+b_1*2^1+b_2*2^2+...+b_{n-1}*2^{n-1}+b_n*2^n

反之,如果是十進位要轉成二進位的話,則需要把數值拿來除2取其餘數的字元,串接組合起來成為二進位數字。以下是利用Scratch來做轉換的方法:

執行的結果如下所示:

以下是Python語言的版本,有興趣的同學們可以比較一下喔。

number = []
n = int(input("Please enter a decimal number to convert:"))
print(bin(n))
while n >= 2:
    x = n % 2
    number.append(x)
    n = int(n / 2)
number.append(n)
for d in reversed(number):
    print(d, end="")

使用二進位來表示文字

在人類的世界中並不是只有數字而已,還使用了大量的文字和符號。以英文為例,它們是由英文字母以及一些標點符號所組成的。

從之前的敘述我們可以知道,3個2進位位數有8種組合,而4個2進位數則有16種組合,依此類推。那麼,要能夠表示所有的英文字母和生活中常用的符號,需要多少種組合呢?首先,要有26個大寫的英文字母以及26個小寫的英文字母,這樣加起來至少就要52個符號了。此外,還有0-9數字、句點、空白、逗點、問號、驚歎號、四則運算符號等等雜七雜八的生活中常用的符號,算一算,工程師就湊了128個,把它們編成了一張表格,就是現在英文字元系統中最常見的以二進位來表示的轉換表格,叫做ASCII(這只是其中的一種,還有許許多多不同的對照表可以用)。其內容可以在以下的連結中查找到:

其中,以大寫的A為例,在表格中,它的ASCII十進位值是65,十六進位值是41,八進位值是101,其實指的就是:

0100 0001 ==> 001 000 001 ==> 41 (Hex) ==> 101 (Oct) ==> 'A' 

早期的電腦計量單位在還沒有統一之前,一個位元組(Byte)有各式各樣的大小,後來逐漸統一以8個位元做為一個位元組,主要的原因除了用來表示英文字母及符號剛好夠用之外,8這個數字剛好可以用3個2進位數字來表示,恐怕也是其中一個原因。

後來電腦在傳輸資料時, 常以一次傳送一個位元組或是其倍數為單位,也就衍生了八位元的電腦、十六位元的電腦、三十二位元的電腦、以及六十四位元的電腦等等,都是以位元組為倍數來設計。

K, M, G, T

生活上要處理的資料量,通常不是一兩個位元組就可以搞定的,所以還需要比較大的計量單位來描述,因此在電腦的許多規格說明中就出現了一些叫做K, M, G, T的東西。其實,這是一般我們在十進位數字系統裡也很常用的計量單位。

K=103=1,000K = 10^3 = 1,000
M=106=1,000,000M = 10^6 = 1,000,000
G=109=1,000,000,000G = 10^9 = 1,000,000,000
T=1012=1,000,000,000,000T = 10^{12} = 1,000,000,000,000

回想一下,二進位數字系統是以2為底來計算次方數,因此,我們就會找比較接近的數值來做為K, M, G, T的單位,如下:

210=1,024=>K2^{10} = 1,024 => K
220=1,048,576=>M2^{20} = 1,048,576 => M
230=1,073,741,824=>G2^{30} = 1,073,741,824 => G
240=>T=1,024G2^{40} => T = 1,024 G

從上面可以知道,在10進位的數字系統中,1T = 1000G,1G = 1000M,1M = 1000K;在2進位的數字系統中,1T = 1024G,1G = 1024M,1M = 1024K,依此類推。

那麼在電腦 的規格中,什麼時候會用到十進位,什麼時候會用到二進位呢?常見的情況是,如果是講的時脈速度,例如CPU的執行頻率,那就是10進位。

如果是講到和資料有關的,像是記憶體的大小是多少GB,那就是二進位,所以硬碟容量、檔案大小,也都是二進位。

還有一個常在提到的,就是傳輸速度,因為電腦(其實手機也是)在衡量傳輸速度是皆是以單位時間內可以傳遞的位元數為單位,因此也都是使用二進位。

在看單位的時候,還是留意大小寫。一般來說,B代表Byte,也就是位元組,而b則是代表bit,也就是位元,這中間相差了8倍喔。而且,在講傳輸速度的時候,傳統上都是以序列(一次一個位元)的方式來計算,因此大部份都是用Kb或Mb來顯示,這是要特別注意的地方。

同學們可以到線上購物的網站看看一些電腦的規格,檢視一下現在電腦的規格中,那裡使用了G,哪裡使用了M,哪裡使用了T喔。

Last updated