歡迎來到資訊表示法 (Information Representation)!
你有沒有想過,電腦本質上只是一堆微小的電子開關,它是如何讓你觀看高畫質電影、播放你最愛的歌曲,或是儲存你的作業?這一切都要歸功於資訊表示法。在本章中,我們將探討電腦如何將現實世界「翻譯」成 1 和 0。如果一開始覺得這些概念有點「天外來客」,請不用擔心——我們會一步一步為你拆解!
1.1 數據表示法:基礎概念
二進位量級:Kilo 與 Kibi 的混淆
在「人類」的世界中,我們使用十進位系統 (Base 10)。當我們說「kilo」時,指的是 1,000。然而,電腦使用二進位系統 (Base 2),所有數值都以 2 的冪次運作。這導致我們在衡量數據時產生了細微的差異。
十進位前綴 (Base 10): 這是你日常生活中使用的單位。
• kilo (k): \(10^3 = 1,000\)
• mega (M): \(10^6 = 1,000,000\)
• giga (G): \(10^9 = 1,000,000,000\)
• tera (T): \(10^{12} = 1,000,000,000,000\)
二進位前綴 (Base 2): 這些是電腦的「真實」測量單位。
• kibi (Ki): \(2^{10} = 1,024\)
• mebi (Mi): \(2^{20} = 1,048,576\)
• gibi (Gi): \(2^{30} = 1,073,741,824\)
• tebi (Ti): \(2^{40} = 1,099,511,627,776\)
記憶小撇步: 如果詞彙中間帶有「bi」(例如 kibi),它就代表 Binary(二進位),因此它使用的是 1,024 倍數的刻度!
數值系統:二進位、十進位與十六進位
在計算機科學中,我們主要使用三種數值系統:
1. 十進位 (Denary/Base 10): 我們每天使用的 0–9 數字。
2. 二進位 (Binary/Base 2): 只有 0 和 1。這是電腦的母語。
3. 十六進位 (Hexadecimal/Base 16): 使用 0–9 以及 A–F(其中 A=10, B=11, C=12, D=13, E=14, F=15)。
為什麼要用十六進位? 它比二進位簡短得多,且人類閱讀時較不容易出錯。一個「十六進位」數字恰好代表 4 個二進位位元(稱為一個 nibble)。
快速回顧: 要將二進位轉換為十六進位,請從右邊開始將二進位數字每 4 個一組分開。例如,\(1011\ |\ 0101\) 會變成 \(B\ |\ 5\),即 \(B5_{16}\)。
二進位編碼十進位 (BCD)
BCD 是一種特殊的數字表示法,將十進位數字的每一個位數各自儲存為 4-bit 的二進位碼。
例子: 要以 BCD 表示數字 85:
8 = 1000
5 = 0101
因此,85 的 BCD 表示為 1000 0101。
現實應用: BCD 常見於數位時鐘或計算機,因為這些設備需要個別控制螢幕上的每一個位數。
帶符號整數:一補數與二補數
電腦如何辨識一個數是負數?我們使用二補數 (Two's Complement)。
步驟:如何使用二補數將數字變為負數:
1. 先寫出該數字的正數二進位形式。
2. 反轉 (Flip) 所有位元(將 0 改為 1,1 改為 0)。這稱為「一補數 (One's Complement)」。
3. 將結果加 1。這就是「二補數」。
常見錯誤: 別忘了在 8-bit 的帶符號數字中,最左邊的位元是符號位元 (sign bit)。如果它是 1,該數字就是負數!
帶符號二進位加法、減法與溢位:
• 加法: 依照二進位加法規則逐個位元進行運算。
• 減法: 先求出減數的二補數(將其變為負數),然後將其加到被減數上。
• 溢位 (Overflow): 當計算結果超出所分配的位元數量時發生(例如,將兩個正的 8-bit 帶符號數字相加,產生的結果太大而無法放入 8 bits 中,導致符號位元被翻轉)。這會導致電腦運算錯誤。
字元集:ASCII、擴充 ASCII 與 Unicode
電腦透過為每個字元分配一個唯一的二進位數字(字元代碼)來表示文字。考試時你不需要死記具體的代碼,但你必須知道這些系統之間的差異:
• 標準 ASCII: 使用 7 bits 來表示每個字元,提供 \(2^7 = 128\) 個可能的字元(包括大寫/小寫英文字母、數字 0–9、標點符號以及控制字元)。
• 擴充 ASCII (Extended ASCII): 每個字元使用 8 bits (1 byte),提供 \(2^8 = 256\) 個可能的字元。這為非英語的帶重音字母及圖形符號提供了額外空間。
• Unicode: 一個通用的字元集,旨在表示世界上所有現代與歷史語言的文字,以及數學符號和表情符號 (emojis)。UTF-8 與 UTF-16 使用可變長度的編碼,而 UTF-32 是固定長度;Unicode 可容納超過一百萬個碼位(code points)。
重點總結: 二進位是給電腦用的,十六進位是讓人更容易閱讀二進位,二補數處理負數,而字元集則將二進位代碼轉換為字母與符號。
1.2 多媒體:圖形與聲音
點陣圖 (Bitmapped Graphics)
點陣圖由稱為像素 (pixels)(圖片元素)的微小點組成。每個像素都被分配了一個二進位顏色代碼。
• 影像解析度: 影像的寬度像素數乘以高度像素數(例如 \(1920 \times 1080\))。
• 螢幕解析度: 螢幕或顯示器上每單位長度所顯示的像素數量(通常以每英吋點數 dots per inch 或每英吋像素 pixels per inch 衡量),或是顯示設備的整體像素尺寸。
• 色深 (Color Depth / Bit Depth): 用來表示單一像素顏色的位元數。使用的位元越多,顏色就越豐富(例如 8-bit 色深允許 \(2^8 = 256\) 種顏色)。
• 檔案標頭 (File Header): 檔案開頭的一小部分,儲存有關影像的元數據 (metadata),例如其尺寸、解析度和色深。
計算檔案大小:
\(\text{File Size} = \text{Image Resolution (Width} \times \text{Height)} \times \text{Color Depth}\)
例子: 一張 \(100 \times 100\) 且具備 1-bit 色深的圖片,檔案大小為 \(10,000\) bits。
向量圖 (Vector Graphics)
向量圖不儲存像素,而是儲存一張繪圖列表,包含數學物件(線條、圓形、矩形)及其屬性(顏色、粗細、位置)。
比喻: 點陣圖就像照片;如果你放大太多,它會變得「有塊狀感」(像素化)。向量圖則像是一組繪圖指令;即使你把它放大得跟房子一樣大,看起來依然完美清晰!
聲音
聲音本質上是類比 (analogue) 的(連續波形),但電腦是數位 (digital) 的。為了儲存聲音,我們必須進行取樣 (sampling)。
• 取樣: 在固定的時間間隔內,「快照」聲音波形的振幅。
• 取樣率 (Sampling Rate): 每秒進行多少次取樣(單位為赫茲,Hz)。取樣率越高 = 品質越好但檔案越大。
• 取樣解析度 (Sampling Resolution): 用來儲存每個取樣點的位元數。解析度越高 = 對聲音音量的表示就越精確。
你知道嗎? 標準 CD 使用的取樣率為每秒 44,100 次!這可是大量的快照。
重點總結: 點陣圖使用像素;向量圖使用數學。聲音是透過將類比波形取樣成數位位元來捕捉的。
1.3 壓縮 (Compression)
壓縮是將檔案變小的過程。我們為什麼需要它?為了節省儲存空間,並讓檔案在網路上傳輸得更快。
破壞性與非破壞性壓縮
1. 破壞性壓縮 (Lossy Compression): 永久刪除一些人類眼睛或耳朵不太可能注意到的數據。一旦刪除,就無法恢復。(例子:JPEG, MP3)。
2. 非破壞性壓縮 (Lossless Compression): 在不遺失任何原始數據的情況下減小檔案大小。當你解壓縮時,它與原始檔案完全相同。(例子:PNG, ZIP)。
遊程編碼 (Run-Length Encoding, RLE)
RLE 是一種簡單的非破壞性壓縮形式。它尋找連續重複的數據片段,並將其儲存為一個單一數值和一個計數。
例子: 想像一排像素:WWWWWBBRRR
使用 RLE,我們將其儲存為:5W, 2B, 3R
我們剛剛把 10 個字元變成了 6 個!這對於具有大面積相同顏色的簡單影像非常有效。
快速回顧: 當你需要極小的檔案且不介意品質輕微下降時(例如串流影片),使用破壞性壓縮。當數據必須完美無缺時(例如文字文件或程式碼),使用非破壞性壓縮。
重點總結: 壓縮節省空間。破壞性壓縮丟棄數據;非破壞性壓縮透過巧妙的儲存方式保留一切完美細節。