2022年12月4日 星期日

『普林斯頓最熱門的電腦通識課』資訊的表示法

基礎的資訊表示法,在越高階的程式語言撰寫中,越無法感覺到它的重要性,反正所有變數就一律宣告長整數或雙倍精度浮點數即可,字串都已經有設計好的 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;根據類似的特性,在一些加速的應用上就可能看到有符號跟無符號數轉來轉去。

同樣重要地,還有 ASCIIUnicode,常有人在應用字串類別時,被這兩種標準碼的轉換搞的暈頭轉向。

當我們應用電腦來處理數位資料變成一種習慣時,就會理所當然的認為這些資料本來就該是數位表示(離散值),殊不知在自然界中的訊號都是類比訊號(連續值),是人類因應電腦計算的方便性,將類比訊號透過「取樣」及「量化」後,才變成數位訊號。

這個轉換過程可以在數位訊號處理的課程中學習如何進行轉換,而在電子產品中,常見所謂的 ADC 轉換器或是 ADC IC,這都是用來將類比訊號轉換成數位訊號的常用元件。

如文中所說的「數位影像」,要將感光陣列中光強所轉化的電荷量變成數位訊號,就需要高速的ADC 來進行訊號處理。

總之,當我們已經習慣用數位資料來表示的時候,也不要忘記真實世界依然是類比連續的。


本章節重點摘要如下:

電腦用三個基本概念來表達資訊:

1. 電腦是「數位處理器(digital processor)」,它們儲存及處理分批進來的「離散值(discrete values,不連續值)」。

2. 電腦以「位元」來表達資訊,一個位元是二進位,不是 0 就是 1

3. 位元組代表更大的東西。數字、字母、文字、聲音、圖片與電影等,全都是以「位元組」表示。

我們的世界是「類比(analog)」的,意指一個東西的數值平滑地隨著另一個東西的變化而變化;然而,現代技術大多是數位表示,在輸入端就要轉換成數位形式,然後輸出端轉回類比形式。

電腦易於處理數位資料,且數位系統比類比系統更容易延伸擴充。

透過「取樣」跟「量化」技術,類比訊號能夠轉換成數位訊號,以類比照片跟數位照片為例說明:

1. 類比照片,把化學塗層的底片感光區域曝光於來自被拍攝物體的光線,不同區域接收到不同量的不同顏色,這影響到底片上的染料;拍照後的底片經過複雜的化學流程,顯影及曬印於相紙上,各種量的彩色染料產生不同的顏色。

2. 數位相片,鏡頭把影像聚焦到位於紅色、綠色及藍色濾鏡後方的矩形感光陣列上,每一個感光區域儲存一個電荷量,這電荷量與感光區域的感光量成比例;這些電荷轉換成數值,相片的數位形式就是代表光強度數值的序列。若感光陣列的數量越多,電荷量的轉換更準確,數位化影像對原始圖像的捕捉就更精確。

有些資訊適合用數位形式表示,例如文字、數字及標點符號等,可以對每一個字母指定一個代表數字,例如 A1B 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

打造只有兩種狀態 (例如開與關) 的設備相對簡單,例如電流 (流動或不流動)、電壓 (高或低)、電荷 (存在或不存在)、磁力 (北或南)、光線 (亮或暗),反射率 (閃亮或不敏感)。

電腦是以二進制資料進行處理,因此我們才需要了解二進制。 

沒有留言:

張貼留言

我的創業筆記 (十二) 合資公司是不是試水溫的好方法?

今天這篇又要聊到我老婆的工作內容了,她今年有關創業方面的內容特別多,所以一再被提及,但就她自己的說法,她並不想創業、她比較想躺平耍廢。 自從健身工作室的經營上軌道後,老婆就沒花費太多額外的精神,反倒是那間進出口公司的老闆非常活躍,衝勁跟野心十足,每天似乎都有新的想法,也搞死她們這...