基礎的資訊表示法,在越高階的程式語言撰寫中,越無法感覺到它的重要性,反正所有變數就一律宣告長整數或雙倍精度浮點數即可,字串都已經有設計好的 API 進行處理,只要知道怎麼用就好。
但越接近硬體層的操作,就要對這些二進制的表示法越熟悉,例如先前我們曾提過的 SIMD 加速指令集,因為要操作暫存器做多位元組的平行處理,因此就要格外注意變數是宣告為幾個位元組的型別,同時也要確認在計算中會不會溢位,另一個特別但又常見的技巧,就是在有符號數及無符號數之間的轉換或運算,這在一些影像處理中,會有特別應用到的地方。
譬如說我們可以用一個位元組來表示無符號的正整數 0 ~ 255,或是有符號的正整數 -128 ~ 127。
這在計算機概論中應該都有學過,但有仔細想過為什麼可以這樣表示嗎?
正數和 0 的二補數就是該數字本身,同時最高位元為 0;負數的最高位元為 1 ,其二補數則是將其對應正數按位元取反向再加上 1,其範例如下:
高 低
0 1 1 1 1 1 1 1 = 127
0 0 0 0 0 0 1 0 = 2
0 0 0 0 0 0 0 1 = 1
0 0 0 0 0 0 0 0 = 0
1 1 1 1 1 1 1 1 = −1
1 1 1 1 1 1 1 0 = −2
1 0 0 0 0 0 0 1 = −127
1 0 0 0 0 0 0 0 = −128
於是乎,當我們用無符號的正整數計算到飽和時,再用有符號的正整數做型別轉換,則 255 會被轉換成 -1;根據類似的特性,在一些加速的應用上就可能看到有符號跟無符號數轉來轉去。
同樣重要地,還有 ASCII 跟 Unicode,常有人在應用字串類別時,被這兩種標準碼的轉換搞的暈頭轉向。
當我們應用電腦來處理數位資料變成一種習慣時,就會理所當然的認為這些資料本來就該是數位表示(離散值),殊不知在自然界中的訊號都是類比訊號(連續值),是人類因應電腦計算的方便性,將類比訊號透過「取樣」及「量化」後,才變成數位訊號。
這個轉換過程可以在數位訊號處理的課程中學習如何進行轉換,而在電子產品中,常見所謂的 ADC 轉換器或是 ADC IC,這都是用來將類比訊號轉換成數位訊號的常用元件。
如文中所說的「數位影像」,要將感光陣列中光強所轉化的電荷量變成數位訊號,就需要高速的ADC 來進行訊號處理。
總之,當我們已經習慣用數位資料來表示的時候,也不要忘記真實世界依然是類比連續的。
本章節重點摘要如下:
電腦用三個基本概念來表達資訊:
1. 電腦是「數位處理器(digital processor)」,它們儲存及處理分批進來的「離散值(discrete values,不連續值)」。
2. 電腦以「位元」來表達資訊,一個位元是二進位,不是 0 就是 1。
3. 位元組代表更大的東西。數字、字母、文字、聲音、圖片與電影等,全都是以「位元組」表示。
我們的世界是「類比(analog)」的,意指一個東西的數值平滑地隨著另一個東西的變化而變化;然而,現代技術大多是數位表示,在輸入端就要轉換成數位形式,然後輸出端轉回類比形式。
電腦易於處理數位資料,且數位系統比類比系統更容易延伸擴充。
透過「取樣」跟「量化」技術,類比訊號能夠轉換成數位訊號,以類比照片跟數位照片為例說明:
1. 類比照片,把化學塗層的底片感光區域曝光於來自被拍攝物體的光線,不同區域接收到不同量的不同顏色,這影響到底片上的染料;拍照後的底片經過複雜的化學流程,顯影及曬印於相紙上,各種量的彩色染料產生不同的顏色。
2. 數位相片,鏡頭把影像聚焦到位於紅色、綠色及藍色濾鏡後方的矩形感光陣列上,每一個感光區域儲存一個電荷量,這電荷量與感光區域的感光量成比例;這些電荷轉換成數值,相片的數位形式就是代表光強度數值的序列。若感光陣列的數量越多,電荷量的轉換更準確,數位化影像對原始圖像的捕捉就更精確。
有些資訊適合用數位形式表示,例如文字、數字及標點符號等,可以對每一個字母指定一個代表數字,例如 A 是 1、B 是 2 等。這就是一個很好的數位表示形式。
在標準的表示法中,A 到 Z 是 65 到 90、a 到 z 是97 到 122、0 到 9 是 48 到 57;其它字符如標點符號就是用別的數值代表。這稱為美國資訊交換標準代碼(American Standard Code for Information Interchange, ASCII)。
不同地區或語言有不同交換標準代碼,但現在趨同名為「統一碼 (Unicode)」 的單一標準。
二進制表示,就是 2 進 1,跟人類常用的十進制有所差異。
數位資訊是用位元 (bit) 表示,這是 binary digit 的縮寫。
由於電腦裡的每個東西都是以二進制來處理,大小與容量之類的屬性往往用 2 的冪次值來表示。
十進制的 1867 可以轉換成二進制的 11101001011 → 1867 = 2^10 + 2^9 + 2^8 + 2^6 + 2^3 + 2^1 + 2^0。
現代電腦中,處理和記憶組織的基本單位是八個位元,八個位元被當成一個位元組(byte)。一個位元組能編碼 256 個不同值(2^8,全都是 0 和 1 的組合)。
四個位元組可以表示四個 ASCII 字元,或兩個 Unicode 字元。
程式設計師常會用到「十六進制」,因為二進數太長了,其表示方式如下:
0 0000 1 0001 2 0010 3 0011
4 0100 5 0101 6 0110 7 0111
8 1000 9 1001 A 1010 B 1011
C 1100 D 1101 E 1110 F 1111
打造只有兩種狀態 (例如開與關) 的設備相對簡單,例如電流 (流動或不流動)、電壓 (高或低)、電荷 (存在或不存在)、磁力 (北或南)、光線 (亮或暗),反射率 (閃亮或不敏感)。
電腦是以二進制資料進行處理,因此我們才需要了解二進制。
沒有留言:
張貼留言