> For the complete documentation index, see [llms.txt](https://nkust.gitbook.io/csx/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nkust.gitbook.io/csx/wei-yuan-wei-yuan-yi-jikmgt.md).

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

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

## 為什麼是二進位Binary？

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

{% hint style="info" %}
沒電-->0-->False-->假值

有電-->1-->True-->真值
{% endhint %}

## 使用二進位來表示數字

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

{% hint style="info" %}
那同學們知道為什麼我們生活中使用的都是10進位嗎？
{% endhint %}

如果是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
```

{% hint style="info" %}
相信同學們應該知道為什麼此種表示法並不常用的原因了吧？！
{% endhint %}

{% hint style="info" %}
廣義上來說，要幾進位都是可以的。
{% endhint %}

{% hint style="info" %}
同學們可以進一步的想想，為什麼在電腦的世界中，除了二進位之外，也常常會看到八進位和十六進位？
{% endhint %}

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

$$
0110 => 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

{% hint style="info" %}
八進位的符號則是：0, 1, 2, 3, 4, 5, 6, 7
{% endhint %}

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

$$
binary = 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來做轉換的方法：

![](https://3758851535-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LMo8PFR2UvTkWwSK8m0%2F-L_8-I1qDRHyK6A6ikiI%2F-L_83IUyd4LQwJjngqw4%2F%E8%9E%A2%E5%B9%95%E5%BF%AB%E7%85%A7%202019-03-04%20%E4%B8%8B%E5%8D%8810.17.12.png?alt=media\&token=67e909ea-441b-41c5-b785-adcfdc19daf5)

執行的結果如下所示：

{% embed url="<https://youtu.be/-9cueuNbBZA>" %}

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

```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（這只是其中的一種，還有許許多多不同的對照表可以用）。其內容可以在以下的連結中查找到：

{% embed url="<http://www.asciitable.com/>" %}

其中，以大寫的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 = 10^3 = 1,000
$$

$$
M = 10^6 = 1,000,000
$$

$$
G = 10^9 = 1,000,000,000
$$

$$
T = 10^{12}  = 1,000,000,000,000
$$

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

$$
2^{10} = 1,024 => K
$$

$$
2^{20} = 1,048,576 => M
$$

$$
2^{30} = 1,073,741,824 => G
$$

$$
2^{40} => T = 1,024 G
$$

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

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

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

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

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

{% hint style="info" %}
同學們可以到線上購物的網站看看一些電腦的規格，檢視一下現在電腦的規格中，那裡使用了G，哪裡使用了M，哪裡使用了T喔。
{% endhint %}
