# 二進位表示法
在[入門系列文章](https://www.entangletech.tw/lesson/popular-02)中我們提到如何用燈泡打造電腦,這些燈泡只有開與關(亮與暗)兩種狀態,透過這兩種狀態便能執行各種運算,從簡單的四則運算到當今火紅的深度學習。
電燈泡這比喻對應到你眼前的電腦或手機,就是電路上電線的有通電和沒通電,或是高電壓與低電壓,即「1」與「0」。為了只透過這兩種狀態做運算,我們必須先將問題轉化成只有「1」與「0」表達的數學問題,即二進位制。
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/r1vJ-MI6p.svg" alt="電燈位元" width="70%"/>
<br>
<p>電腦計算的基本單位是位元,就如同這裡比喻的燈泡,當燈泡為暗時,代表 「0」,亮則代表 「1」,對應電腦裡,沒有電流通過代表 「0」,有電流通過則為 「1」(或是低電壓與高電壓)
</p>
</div>
由於量子電腦也只能處理 0 與 1 的問題,因此二進位制在量子計算上也很重要。
## 十進位轉二進位
### 整數
我們日常使用的數字系統就是十進位制,只使用數字 0 到 9,一旦數字超過 9,就回到 0 並向前進位。同樣地,二進位即數字只有數字 0 和 1,當數字超過 1 時,也回到 0 並向前進位。
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/HkpdCnvDA.svg" alt=“十進位” width="100%"/>
<br>
<p>
</p>
</div>
我們來看一個簡單的例子,「19+2」。首先,我們從個位數開始計算,「9+2」,(從上圖可知,)9 的下一位是 0,再往下一位是 1,所以個位數變成 1。因為 9+2=11,超過了單位數字可以表達的範圍,所以要進位到十位數。十位數的部分是原來的 1 ,加上從個位數進位的 1,得到 2,最終結果是「21」。
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/BJV_2nDD0.svg" alt="19+2" width="50%"/>
<br>
<p>
</p>
</div>
將我們熟悉的數字轉成二進位,最簡單的方法就是做除法,取每次除法的餘數就是二進位,直到商為 0。以 77 為例
\begin{split}
77\div 2=38...&1\\
38\div 2=19...&0\\
19\div 2=9...&1\\
9\div 2=4...&1\\
4\div 2=2...&0\\
2\div 2=1...&0\\
1\div 2=0...&1
\end{split}
從最下面往上,將每條式子的餘數從左到右寫出來,即「1001101」,這就是 77 的二進位表示法。圖解如下:
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/rJZQ92PP0.svg" alt="77 的二進位表示" width="50%"/>
<br>
<p>依照箭頭方向把餘數由左寫到右,即 01001101,通常最左邊的 0 可以省略(就像是 015 我們平常都直接寫 15)
</p>
</div>
以「78」的例子
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/HJ3n52vD0.svg" alt="78 的二進位表示" width="50%"/>
<br>
<p>78 的二進位表示法為 1001110
</p>
</div>
讓我們看看「77+1=78」的二進位表示法。77 的二進位是 1001101,當我們加 1 時,從個位數開始,1+1 在二進位制中會進位變成 0。下一位原本是 0,加上進位的 1,變成 1。後面的數字保持不變,最終結果是 1001110,即 78 的二進位表示。
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/ry31GpwPC.svg" alt="77+1=78 的二進位表示" width="50%"/>
<br>
<p>
</p>
</div>
### 小數
小數或說分數,如 78.625 該如何用二進位表示呢?首先,把整數和小數分開算,整數的部分用上述方法轉成二進位,小數部分下文會提及怎麼算,算完後以小數點為分界,小數點左邊放整數的二進位表示,右邊則放小數的二進位表示。
以 78.625 為例,拆成整數「78」和小數「0.625」兩部分。整數的部分從上述方法得出,78 的二進位表示法是 1001110。小數的部分,整數的時候是除 2,那小數的時候是乘 2,即:
\begin{split}
0.625\times 2=1.25=&1+0.25\\
0.25\times 2=0.5=&0+0.5\\
0.5\times 2=1=&1+0
\end{split}
將結果,從式子中由上到下,由左到右書寫出「101」,再加小數點,即「.101」(或 0.101),這是 0.625 的二進位表示法。
因此 78.625 的二進位表示法為 1001110.101
### 負數
負數,如 -2 的二進位表示法,在初階量子計算中很少用到,因此在這裡不做詳細介紹。如果有興趣想了解更多,可以參看這篇[科普文章](https://kopu.chat/%E4%B8%96%E7%95%8C%E4%B8%8A%E5%8F%AA%E6%9C%8910%E7%A8%AE%E4%BA%BA%EF%BC%8C%E4%B8%80%E7%A8%AE%E6%98%AF%E6%87%82%E4%BA%8C%E9%80%B2%E4%BD%8D%E7%9A%84/)
## 二進位轉十進位
將數學問題(像是 77+1)轉成二進位給電腦做計算,計算結果是不太直觀的二進位表示法,需要轉回我們熟悉的十進位,呈現在螢幕上,我們才能直觀解讀計算結果。
我們知道,將 78 轉成二進位是除 2,那要逆回來變成十進位就是乘 2,在介紹如何乘 2 回來之前,我們用另一個角度回顧十進位:
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/HJ2Cs6vDR.svg" alt="78 十進位表示法" width="50%"/>
<br>
<p> 70+8 等於 78
</p>
</div>
從上圖可知,十進位制的意思就是以 10 為基底(即 $10^n$)表達數字
\begin{split}
78_{10}&=7\times 10+8\times 1\\
&=7\times10^1+8\times10^0
\end{split}
同樣道理,二進位制就是以 2 為基底表達數字:
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/S1dYR6vwA.svg" alt="1001110 轉成十進位" width="100%"/>
<br>
<p>
</p>
</div>
把圖上數字都加起來
\begin{split}
1001110_2&=1\times2^6+0\times2^5+0\times2^4+1\times2^3+1\times2^2+1\times2^1+0\times2^0\\
&=64+0+0+8+4+2+0\\
&=78
\end{split}
如果是小數點,剛剛是透過乘 2 轉成二進位,那逆回來十進位就要除 2,不過我們可以用更 general 的方法來表達,即 $\times 2^{-n}$,以 1001110.101 為例:
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/rkbcxRDvR.svg" alt="1001110.101 轉成十進位" width="100%"/>
<br>
<p>看粉色的部分,透過除 2 的方式將小數點的部分從二進位轉回十進位
</p>
</div>
## 後記
學會了這些方法後,你將能輕鬆地將任何數字從十進位轉成二進位,再轉回來,更進一步,你還可以轉換到其他進位制,如三進位、十六進位等。
除了數字以外,文字、符號、圖像與影片等都能用二進位表示,有興趣的話可以在網路上搜尋相關資料。
在下一篇文章,我們將介紹電腦的「邏輯閘」操作,並說明如何透過邏輯閘來操作二進位數字,以實現各種計算和運算。