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

## 為什麼是二進位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來做轉換的方法：

![](/files/-L_83IUyd4LQwJjngqw4)

執行的結果如下所示：

{% 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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://nkust.gitbook.io/csx/wei-yuan-wei-yuan-yi-jikmgt.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
