淺談二進位與十六進位,為什麼電腦要使用?你所不知道的二進位。 === [TOC] 歡迎你點入本篇文章,會促成我想做這篇的原因,主要是因為在上計概時,突然浮現很多靈感,跟一大堆的問題(~~教授,為什麼要講的這麼淺白呢?我想知道更多啊啊!~~),為了一次解決我所有的困惑,於是製作本篇文章。 若文章有任何疑點及錯誤的地方歡迎提出。 為何電腦用二進位? --- 直接說結論,最重要的原因當然就是二進位(0、1)最穩定且可靠的對應電子裝置的開/關狀態。 會使用二進位,也跟電子元件的物理特性息息相關: - 電晶體(Transistor)或邏輯閘(Gate)只有兩種穩定狀態:導通(1:ON)跟截止(0:OFF)。 - 因為這樣的關係,所以可減少誤判跟雜訊影響。 再來就是二進位的抗雜訊的能力強,請看圖:  Image Source:[類比數位訊號控制 - 鈺傑自動控制](https://www.ycautomation.com.tw/list/cate-337444.htm) 類比訊號中 0 ~ 5V 的任意值容易被雜訊所干擾,有很大機會會預判錯誤。比如說我們有個溫度感測器,輸出 0 ~ 5V 模擬電壓,對應 0°C ~ 100°C。 正常情況下,當感測器輸出 2.50 V,就代表當前溫度為 50°C。如果連線或環境有電磁干擾(如假設旁邊大功率馬達啟動時產生的雜訊),感測訊號可能會疊加上一個高頻尖刺,使原本的 2.50 V 暫時被擾動到 2.80V。電腦或模數轉換器(ADC)在取樣那一刻會把 2.80 V 當作真實值,就會誤判當前溫度為 56°C,造成反應過度或控制失準。 如果我們這時候是使用數位訊號,也就是二進位訊號,只要判斷高於某個閾值(如 2.5V)就是 1、低於就是 0,即便受到幅度小於 0.3V 的雜訊,也不會把 0 誤判成 1。 ### 電路設計與運算效率的考量 簡單且一致的邏輯運算一直以來都是用二進位的優點之一,比如說與二進位對應的 AND、OR、NOT Gates 都可用最少元件去實現,再來複雜運算(加法、乘法)都可分解為大量簡單的二進位邏輯運算,易於優化與平行化。  Image Source:[Understanding AND OR NOT Gates with simple Graphics and Truth Tables – Hacky Labs](https://computerengineeringforbabies.com/blogs/engineering/and-or-not-gates?srsltid=AfmBOopJvKvK6t4hErMnJU7-oGgm2LarQqXRcjpj_ldJkvoYChBoDkQi) 我們也可用二進位真值表來描述 AND、OR、NOT 這些布林邏輯閘,相信各位應該都看到快爛了: AND: | IN_1 | IN_2 | OUT | | -------- | -------- | -------- | | 0 | 0 | 0 | | 1 | 0 | 0 | | 0 | 1 | 0 | | 1 | 1 | 1 | OR: | IN_1 | IN_2 | OUT | | -------- | -------- | -------- | | 0 | 0 | 0 | | 1 | 0 | 1 | | 0 | 1 | 1 | | 1 | 1 | 1 | XOR: | IN_1 | IN_2 | OUT | | -------- | -------- | -------- | | 0 | 0 | 0 | | 1 | 0 | 1 | | 0 | 1 | 1 | | 1 | 1 | 0 | 等等這些都不列了。 接下來繼續說,再來使用二進位後,也深深影響到記憶體跟一些儲存裝置的設計。 記憶體的結構大致上是多個 1T1C 的架構,也就是 1 Transistor 1 Capacitor 的結構,記憶體中一個位元只需一個位元儲存元件(1T1C),結構簡單易用。 在硬碟、快閃記憶體中也是透過「寫入高電壓/低電壓」或「充電/放電」代表二進位,以此來儲存資料用。 進位制之間的轉換 --- ### Binary to Decimal 假設有個二進位 $(11010001)_2$ ,我們想要把它轉成人類常用的十進位制,可以這樣做: 從最右邊那位開始,就是 $2^0 \times 1$ ,往左加一位 $2^1 \times 0$ ,以此類推,最後可得到以下式子: $2^0 \times 1 + 2 ^ 1 \times 0 + 2 ^ 2 \times 0 + \cdots + 2^7 \times 1$ 加起來就得到了十進位的 209。 上面這樣子做就如同十進位會分個十百千位一樣,像 209 這個數字,個位數不就是 $10^0 \times 9$ 嗎?十位數就是 $10^1 \times 0$ ,百位數為 $10^2 \times 2$ ,三者加起來為 209。 ### 其他進位制轉十進位 如果是其他進位制像是三進位、四進位等等,要轉成十進位的方式也一樣。 這邊我們假設有個八進位的數字:$(321)_8$ ,用剛剛的方法就會得出以下式子: $8^0 \times 1 + 8^1 \times 2 + 8^2 \times 3 = 209$ ### Decimal to Binary 相反過來,若我們將十進位轉二進位呢? 這時候可以做短除法,每次都除於 2,且把除於 2 的餘數記下來,直到不能再除為止。 短除法做完後如圖(以十進位 209 轉二進位為例):  此時二進位就是由下往上拼湊起來,最後得到 $(11010001)_2$ 。 ### 十進位轉其他進位制 其實做法也一樣,就是用短除法,每次都除上那個進位制的數字,然後取餘數就可以了。 而這種做法叫做「除基取餘法」,是轉換十進位(Decimal)到任意進位制(Base N,N > 1)的通用步驟。 比如說下圖把十進位 209 轉八進位:  最後由下往上取餘數得到八進位數字 $(321)_8$ 。 ## 為什麼電腦習慣使用十六進位? 在表示記憶體位址的時候,可以發現是用十六進位,而非二進位,為什麼呢?這個答案其實很簡單。 補充十六進位的表示法:1 2 3 4 5 6 7 8 9 A B C D E F ### 和二進位的對應關係 **二進位 4 bits 對應一位十六進位**,這樣就能表示出 $2^4 = 16$ 種組合,比如說 $(1010)_2$ 就可表示成 $(A)_{16}$ 。 這樣做的好處是什麼? 1. 簡潔明瞭 你應該不希望看到那麼多的資訊吧?比如說一個記憶體位在 $(1100 1010 0010 0000 1111)_2$,這樣看是不是很痛苦?轉換成十六進位後資訊就縮短了,變成 $(CA20F)_{16}$ 。 2. 人與機器間的橋樑 就如剛才所說的,這種方式能有效縮短由底層二進位碼到人類可理解形式的距離,使程式設計師能快速理解、除錯與操作低階數據。 3. 方便轉換與運算 像剛才的記憶體位址用二進位表示,在轉換時只要把二進位切成每四位元即可對應轉換成十六進位,相當方便。 如 1100 = C, 1010 = A, 0010 = 2, 0000 = 0, 1111 = F,最後就可以得到 CA20F 了。 人眼直接讀二進位較費力,而十六進位讀寫簡潔且可一眼確認每個 nibble(半位元組)的值。 如果不太熟悉這兩者之間轉換的話,我們可以簡單列個表: | 二進位 | 十六進位 | | -------- | -------- | | 0000 | 0 | | 0001 | 1 | | 0010 | 2 | | 0011 | 3 | | 0100 | 4 | | 0101 | 5 | | 0110 | 6 | | 0111 | 7 | | 1000 | 8 | | 1001 | 9 | | 1010 | A | | 1011 | B | | 1100 | C | | 1101 | D | | 1110 | E | | 1111 | F | 4. 符合硬體架構 大多數記憶體跟資料單位(位元組是 8 bits),都可以用 2 位十六進位完美表示,就比較方便對 bytes 去做排列、操作。 ### 用其他進位制不好嗎? 用其他進位制不好嗎?比如說十進位、八進位、十七進位等等。 我們可以來試試看八進位。 假設有個二進位數字 $(10110101)_2$ ,由於八進位只能對應三個二進位數字($2^3 = 8$),三位三位這樣去分割後剩下 2 位無法剛好配對。 10110101 就變成 101、101、01 。對於記憶體、資料對齊來說會有分割困難,不利於硬體與軟體直接處理。 然後再來看看十進位: 十進位與二進位結構相差非常大,是無法整除的($2^n \neq 10$),必須用較複雜的演算法才能正確對應、運算,如進行加減乘除、資料轉換都比十六進位複雜得多,也不方便硬體設計和程式編寫。 其他進位制呢?比如說 Base-64: Base-64 雖適合資料壓縮、編碼(如網路圖片、郵件附件等),可直接跟 6 位元做配對,但它跟硬體底層架構(8、16、32、64位元等)無直接關係,且一般用途不需要這種高壓縮度,用 Base-64 就如同殺雞用牛刀。 另外若我們用像十七進位這種進位制,它會缺乏硬體原生設計支援。因為計算機邏輯電路主要設計用來處理 $2^n$ 進位(如 4、8、16、32、64),進位數不是這類型的,會造成處理困難、效率低下。 所以終究而言,十六進位是歷代電腦科學家們找到最能完美與二進位一搭一唱的進位制,也能整齊地映射記憶體結構,重點是轉換簡單、效率高成為它受歡迎的原因。 那些使用二進位儲存資料的裝置 --- 舉凡使用二進位儲存資料的裝置,實在是不勝枚舉,以下是一些例子: - 記憶體(RAM、DRAM、SRAM 等) 資料皆以電荷有無(二進位)儲存在各記憶單元,電腦運算都仰賴這些位置讀寫 0 / 1 位元。 - 硬碟(HDD) 利用磁片表面磁極性正負代表 0 / 1,每個磁粒子就記錄一個 bit,將檔案全拆分成大量的 0 和 1 記錄在磁片上。 - 固態硬碟(SSD、快閃記憶體等) 用晶片中電子有無代表 0 / 1,每個單元存一個或多個位元,但最後它也只存二進位資料。 - 光碟(CD / DVD / 藍光等) 利用盤面上反射/不反射代表0或1,最底層都是二進位架構。 總結 --- 電腦使用二進位的最主要原因是二進位(0、1)能穩定且可靠地對應電子裝置的開關狀態。這種設計與電子元件的物理特性完美配合,同時具備強大的抗雜訊能力。 ### 電子元件的物理特性 電腦使用二進位與電子元件的基本特性密切相關: - 電晶體特性:電晶體或邏輯閘只有兩種穩定狀態 - 導通(1:ON)和截止(0:OFF) - 減少誤判:這種二元狀態設計可以有效減少誤判和雜訊影響 ### 抗雜訊能力 二進位相比類比訊號具有更強的抗干擾能力: - 類比訊號問題:以溫度感測器為例,當輸出 2.50 V(對應50°C)時,如果受到電磁干擾變成 2.80 V,系統就會誤判為 56°C。 - 數位訊號優勢:使用二進位訊號時,只要設定閾值(如2.5V),高於閾值為 1、低於為 0。即使受到0.3 V以內的雜訊干擾,也不會造成誤判。 ### 電路設計與運算效率 二進位在電路設計上具有優勢: - 邏輯運算簡單:AND、OR、NOT Gates 可用最少元件去實現 - 易於優化:複雜運算可分解為大量簡單的二進位邏輯運算 - 記憶體結構:採用 1T1C 架構(1個電晶體+1個電容),結構簡單 ### 進位制轉換 - 二進位轉十進位 - $(11010001)_2$ 為例: - $2^0 \times 1 + 2^1 \times 0 + 2^2 \times 0 + \cdots + 2^7 \times 1 = 209$ - 十進位轉二進位 - 除基取餘法:將十進位數持續除以 2,記錄餘數,最後由下往上組合即可。 - 其餘進位制轉換 - 皆可採取以上方法去做。 ### 為什麼使用十六進位 電腦在顯示記憶體位址時偏好使用十六進位,主要原因: - 完美對應關係 - 二進位 4 位對應十六進位 1 位: $2^4 = 16$ 種組合可完美對應。 - 實用優勢: | 優勢 | 說明 | | -------- | -------- | | 簡潔明瞭 | $(1100 1010 0010 0000 1111)_2$ 可簡化為 $(CA20F)_{16}$ | | 方便轉換 | 每 4 位二進位直接對應 1 位十六進位 | | 符合硬體 | 1 個位元組(8 位元)可用 2 位十六進位表示 | | 人機橋樑 | 縮短機器底層二進位與人類理解之間的距離 | - 其他進位制的局限 - 八進位:與 8 位元組結構不完全匹配,分割困難。 - 十進位:與二進位結構相差太大,轉換複雜。 - 其他進位制:缺乏硬體原生支援,效率低下。 ### 使用二進位的儲存裝置 現代電腦中幾乎所有儲存裝置都採用二進位: - 記憶體(RAM、DRAM、SRAM):以電荷有無儲存0/1 - 硬碟(HDD):利用磁極性正負代表0/1 - 固態硬碟(SSD):用電子有無代表0/1 - 光碟(CD/DVD/藍光):利用反射/不反射代表0/1 參考資料 --- [SSD 與 HDD 的比較 – 資料儲存裝置之間的差異 – AWS](https://aws.amazon.com/tw/compare/the-difference-between-ssd-hard-drive/) [硬碟基本原理 - 凌威科技](https://www.linwei.com.tw/forum-detail/27/) [什麼是 DRAM? | Pure Storage](https://www.purestorage.com/tw/knowledge/what-is-dram.html) [Why do we use hexadecimal?. If you’re a programmer, you’re probably… | by Niko Savas | Medium](https://medium.com/@savas/why-do-we-use-hexadecimal-d6d80b56f026) [Day8:[計算機概論]十進位和二進位的轉換 | iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天](https://ithelp.ithome.com.tw/m/articles/10203307) [Why do computers still use Binary instead of a Base 5, 10, 12 system? : r/askscience](https://www.reddit.com/r/askscience/comments/254wpp/why_do_computers_still_use_binary_instead_of_a/) [Hexadecimal - Wikipedia](https://en.wikipedia.org/wiki/Hexadecimal) [Binary number - Wikipedia](https://en.wikipedia.org/wiki/Binary_number) [【CodingBar】什麼是二進位?|程人式界科普 #01 - YouTube](https://www.youtube.com/watch?v=VsefOJjva5I)
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.