跳轉到內容

計算機科學基礎/資訊表示

來自華夏公益教科書,開放的書本,開放的世界

資訊表示

[編輯 | 編輯原始碼]

介紹性問題

[編輯 | 編輯原始碼]

計算機通常將顏色表示為一個紅-綠-藍 (RGB) 數值集,稱為“三元組”,其中紅色、綠色和藍色分量都是 0 到 255 之間的整數。例如,顏色 (255, 0, 10) 具有全紅色、無綠色和少量藍色。編寫一個演算法,該演算法以顏色的 RGB 分量作為輸入,並返回一個訊息,指示最大分量或分量。例如,如果輸入顏色為 (100, 255, 0),則演算法應輸出“最大分量(s):綠色”。如果輸入顏色為 (255, 255, 255),則演算法應輸出“最大分量(s):紅色、綠色、藍色".

本章概述

[編輯 | 編輯原始碼]

計算機的一個驚人之處在於它們可以儲存如此多的不同型別的資料。當然計算機可以儲存數字。但與簡單的計算器不同,它們還可以儲存文字,並且可以儲存顏色、影像、音訊、影片以及許多其他型別的資料。而且它們不僅可以儲存多種型別,還可以分析它們,並將它們傳輸到其他計算機。這種多功能性是計算機如此有用並影響我們生活如此多領域的原因之一。

要了解計算機和計算機科學,重要的是要了解計算機如何處理不同型別的資料。讓我們回到顏色。顏色是如何儲存在計算機中的?介紹性問題陳述了一種方法:作為 RGB 三元組。這不是唯一可能的方法。RGB 只是眾多顏色系統之一。例如,有時顏色用 HSV 三元組表示:透過色調、飽和度和亮度。然而,RGB 是計算機程式中最常見的顏色表示。

這導致了一個更深層次的問題:計算機是如何儲存數字的?為什麼我們必須瞭解數字和其他不同型別的資料是如何在計算機中儲存和處理的?本章討論了這些問題以及相關問題。特別是,我們將看看以下內容

  1. 為什麼這是一個重要的主題?
  2. 計算機如何表示數字?
  3. 計算機如何表示文字?
  4. 計算機如何表示其他型別的資料,例如影像?
  5. 什麼是二進位制數系,為什麼它在計算機科學中很重要?
  6. 計算機如何進行基本運算,如加法和減法?

完成本章後,您應該能夠執行以下操作

  1. 能夠解釋計算機在最低級別上如何表示數值資料和文字資料,以及其他型別的資料,例如顏色資料。
  2. 能夠解釋和使用該領域的基本術語:位、位元組、兆位元組、RGB 三元組、ASCII 等。
  3. 能夠將數字和文字從一種表示形式轉換為另一種表示形式。
  4. 能夠將整數從一種表示形式轉換為另一種表示形式,例如從十進位制表示形式轉換為二進位制補碼錶示形式。
  5. 能夠對無符號二進位制或二進位制補碼錶示形式的數字進行加減運算。
  6. 能夠解釋用於表示資料的位數如何影響表示的範圍和精度。
  7. 能夠一般性地解釋計算機如何表示不同型別的資料,例如影像。
  8. 能夠進行涉及某些資料集的記憶體量或下載時間的計算。

資料表示和數學

[編輯 | 編輯原始碼]

資料表示與博雅教育和數學有什麼關係?正如您可能猜到的那樣,它們之間有著密切的聯絡。計算機將所有資料儲存為二進位制(即以 2 為底)數字。因此,要了解計算機,就必須瞭解二進位制。此外,您不僅需要了解二進位制基礎知識,還需要了解一些複雜之處,例如下面討論的“二進位制補碼”表示法。

二進位制表示之所以重要,不僅因為它描述了計算機如何表示資料,而且因為計算機和計算的很大一部分都基於它。例如,我們將在關於機器組織的章節中再次看到它。

資料表示與社會和技術

[編輯 | 編輯原始碼]

計算機革命。您經常聽到這個詞來形容計算機影響我們生活的方式。另一個您可能聽到的詞是數字革命。數字革命是什麼意思?

如今,我們許多裝置都是數字化的。我們有數字手錶、數字手機、數字收音機、數字電視等。然而,以前許多裝置是模擬的:“資料……由連續變化的物理量表示”[1] 例如,想想那些具有秒針、分針和時針的老式手錶,這些指標連續移動(儘管分針和時針移動得很慢)。將其與許多現代手錶進行比較,現代手錶顯示時間的數字表示形式,例如 2:03:23。

此示例突出了模擬裝置和數字裝置之間的關鍵區別:模擬裝置依賴於連續現象,而數字裝置依賴於離散現象。作為這種差異的另一個例子,模擬收音機接收音訊廣播訊號,這些訊號作為無線電傳輸,而數字收音機接收的訊號是數字流。[2]

數字革命指的是許多數字裝置、它們的用途及其影響。這些裝置不僅包括計算機,還包括在我們生活中發揮重要作用的其他裝置或系統,例如通訊系統。

由於數字裝置通常使用二進位制數系統儲存數字,因此本章的一個主要主題是資料的二進位制表示。二進位制是計算機和計算機科學的基礎:要了解計算機的工作原理以及計算機科學家的思維方式,您需要了解二進位制。因此,本章的第一部分將介紹二進位制基礎知識。第二部分在此基礎上構建,並解釋計算機如何儲存不同型別的資料。

表示基礎

[編輯 | 編輯原始碼]

計算從根本上來說是關於資訊處理的。每次計算都是對符號的某種操作,這種操作可以純粹機械地(盲目地)完成。如果我們可以使用符號表示資訊,並知道如何處理這些符號並解釋結果,我們就可以訪問有價值的新資訊。在本節中,我們將研究計算中的資訊表示。

演算法章節討論了描述操作序列的方法。計算機科學家使用演算法來指定計算機的行為。但是,為了使這些演算法有用,它們需要資料,因此計算機需要能夠表示資料。[3]

資訊作為訊息的內容傳達,當我們用感官解釋和感知這些訊息時,會導致某些心理反應。資訊總是被編碼成某種形式以進行傳輸和解釋。我們一直都在處理資訊。例如,我們在閱讀書籍、聽故事、看電影或做夢時會接收資訊。我們在寫電子郵件、畫畫、在表演中表演或發表演講時會提供資訊。資訊是抽象的,但它透過具體的媒介傳達。例如,電話上的對話會傳遞資訊,但資訊在傳播過程中由聲波和電子訊號表示。

資訊是抽象的/虛擬的,而承載資訊的媒介必須是具體的/物理的。因此,在任何資訊可以被處理或傳遞之前,它必須被量化/數字化:這是一個將資訊轉換為使用符號的(資料)表示的過程。

人們有許多方法來表示一個非常簡單的數字。例如,數字 4 可以表示為 4 或 IV 或||||或 2 + 2,等等。計算機如何表示數字?(或文字?或音訊檔案?)

計算機表示和處理數字的方式與我們不同。自早期計算機歷史以來,二進位制數系統一直是標準。計算機“喜歡”二進位制,因為這對它們來說非常容易。然而,二進位制對人類來說並不容易。雖然大多數時候人們不需要關心計算機使用的內部表示,但有時他們確實需要。

為什麼是二進位制?

[編輯 | 編輯原始碼]

假設你和一些朋友在週末去小屋度假。這群人將乘坐兩輛不同的汽車前往,你們都同意第一組到達的人將留下前燈開啟,以便後面一組更容易找到。當您乘坐的汽車到達小屋時,您可以透過燈光判斷您的汽車是否先到達。因此,燈光編碼了兩種可能性:開(另一組已經到達)或關(另一組尚未到達)。

為了傳遞更多資訊,您可以使用兩盞燈。例如,兩盞燈都關表示第一組尚未到達,第一盞燈關第二盞燈開表示第一組已經到達,但離開了去採購,第一盞燈開第二盞燈關表示這組已經到達,但離開了去釣魚,兩盞燈都開表示這組已經到達,並且沒有離開。

注意這裡的關鍵思想:一盞燈可以開或關(我們不允許不同的燈光級別、多種顏色或其他選項),只有兩種可能性。但第二個是,如果我們要表示超過兩個選擇,我們可以使用更多燈。

這種“開或關”的理念是一個強大的理念。有兩個且只有兩個不同的選擇或狀態:開或關、0 或 1、黑或白、存在或不存在、大或小、粗糙或光滑,等等——所有這些都是表示可能性的不同方式。雙重選擇理念如此強大的一個原因是,更容易構建資料在最低級別處於兩種可能狀態的物件——計算機、相機、CD,等等,無論是 0 還是 1。[4]

在計算機表示中,一個(即二進位制數字)可以是 0 或 1。位集合稱為位串。一個 8 位長的位串稱為位元組。位和位元組是計算機儲存和資料傳輸中的重要概念,稍後我們將進一步解釋它們以及一些相關的術語和概念。但首先我們將研究計算機如何表示數字的基本問題。

一個簡短的歷史旁白

[編輯 | 編輯原始碼]

克勞德·夏農被認為是資訊理論之父,因為他第一個研究並構建了資訊和資訊傳遞的數學模型。他還對計算做出了許多其他重要貢獻。他具有開創性的論文“通訊的數學理論”(1948 年)改變了我們對資訊的看法,為資訊時代奠定了基礎。夏農發現資訊的根本單位是對一個問題的肯定或否定答案,或一個具有兩個不同狀態的位元,它只能用兩個符號來表示。他還透過證明布林代數的命題可以用來構建能夠執行一般計算(對兩種型別符號的操作)的“邏輯機器”,奠定了數字計算機/電路的設計理論。 資料是另一個與資訊密切相關的術語,它是對資訊表示的抽象概念。我們將交替使用資訊表示和資料。

外部和內部資訊表示

[編輯 | 編輯原始碼]

資訊可以在不同的級別表示。將資訊表示分為兩類是有幫助的:外部表示和內部表示。外部表示用於人機之間的通訊。我們在計算機顯示器或螢幕上看到的一切,無論是文字、影像還是動態圖片,都是某些資訊的表示。計算機還使用聲音和其他媒介來外部表示資訊,例如盲人使用的觸控板來閱讀文字。

在內部,所有現代計算機都將資訊表示為位。我們可以將位視為一個具有兩個可能值的數字。由於位是資訊的基本單位,因此它足以表示所有資訊。它也是最簡單的表示,因為只需要兩個符號就可以表示兩個不同的值。這使得用物理方式表示位變得很容易——任何能夠具有兩種不同狀態的裝置都可以使用,例如一個切換開關。我們將在後面看到,現代計算機處理器是由稱為電晶體的微型開關組成的。

十進位制數系統的回顧

[編輯 | 編輯原始碼]

當位組合成序列時,它們可以表示數字。我們熟悉用數字來表示數量。數字是表示抽象數量的具體符號。人類有十根手指,方便地採用了十進位制(十進位制)記數系統,它需要十個不同的符號。我們都瞭解十進位制表示,並且每天都在使用它。例如,阿拉伯數字使用 0 到 9。每個符號表示十的冪,具體取決於符號所處的位置。

因此,例如,數字一百二十四是 。我們可以透過在 124 中的數字上方寫出 10 的冪來強調這一點

10^2  10^1 10^0
   1     2    4

因此,如果我們利用對十進位制的瞭解並將其應用於二進位制,我們可以弄清楚二進位制。但首先請記住,一個位是一個二進位制數字,一個位元組是 8 位。在本檔案中,我們談論的大多數二進位制數都將是一位元組長。

(計算機實際上使用不止一個位元組來表示大多數數字。例如,大多數數字實際上是用 32 位(4 位元組)或 64 位(8 位元組)來表示的。位數越多,可以表示的不同值就越多:一位允許 2 個值,兩位給出 4 個值,三位給出 8 個值,...,八位給出 256 個值,一般來說,n 位給出 個值。然而,在檢視二進位制示例時,我們通常會使用 8 位數字來使示例易於管理。

十進位制系統用於數字表示是某種程度上任意的。事實上,我們經常使用其他進位制系統來表示不同性質的數量:一週中的天數使用 7 進位制,一小時中的分鐘使用 60 進位制,一天中的小時使用 24 進位制,一磅中的盎司使用 16 進位制等等。不難想象,2 進位制(兩個符號)是最簡單的進位制系統,因為在少於兩個符號的情況下,我們無法表示變化(因此沒有資訊)。

無符號二進位制

[edit | edit source]

當我們談論十進位制時,我們處理的是 10 個數字 - 0 到 9(這就是 decimal 的由來)。在二進位制中我們只有兩個數字,這就是為什麼它是 binary。二進位制中的數字是 0 和 1。你永遠不會看到任何 2 或 3 等等。如果你看到了,那就說明有問題。一個位元總是 0 或 1。

二進位制計數如下

    0     (decimal 0) 
    1     (decimal 1) 
   10     (decimal 2) 
   11     (decimal 3) 
  100     (decimal 4) 
  101     (decimal 5) 
  ...

一個老笑話是,“世界上有 10 種人。懂二進位制的和不懂二進位制的。”

接下來要考慮的是在一個位元組中有哪些值是可能的。讓我們列出在一個位元組中 2 的冪

2^7  2^6  2^5  2^4  2^3  2^2  2^1  2^0
128  64   32   16   8    4    2    1 

例如,二進位制數 10011001 是 請注意,8 個位元中的每一個都可以是 0 或 1。因此,最左邊的位元有兩個可能性,下一個位元有兩個可能性,再下一個位元有兩個可能性,等等:8 個位元中的每一個都有兩個選擇。將這些可能性相乘,得到 或 256 種可能性。在 無符號二進位制 中,這些可能性代表從 0(所有位元為 0)到 255(所有位元為 1)的整數。

所有進位制系統的工作原理都是一樣的:最右邊的數字代表底數的零次方(記住,任何數的零次方都等於 1),左邊的每個數字代表的量是右邊數字的底數倍。二進位制數 1001 代表十進位制中的 9,因為最右邊的 1 代表 ,零在 位置上沒有貢獻,最後最左邊的 1 代表 。當我們使用不同的進位制系統時,需要將底數作為下標來表示,以避免混淆。例如,我們寫 表示二進位制數 1001(代表十進位制中的 9)。下標 2 表示“二進位制”:它告訴讀者它 代表十進位制中的 1001。這個例子也向我們展示了,表示法本身沒有內在意義。相同的符號模式,例如 1001,可以根據其解釋方式來代表不同的數量。有許多其他方法來代表數量 (記住:讀作“十進位制中的九”);例如,漢字 九 代表了同一個數量。

由於同一個數量可以用不同的方式來表示,我們通常可以改變表示方式而不會改變它代表的數量。正如之前所示,二進位制表示 等效於十進製表示 - 代表完全相同的值。在學習計算的過程中,我們經常需要在十進位制表示法(我們最熟悉)和二進位制表示法(計算機內部使用)之間進行轉換。

二進位制到十進位制的轉換

[edit | edit source]

將非負整數的二進位制表示轉換為其十進位制表示是一個直接的過程:將每個二進位制數字代表的數量加起來,就能得到結果。

十進位制到二進位制轉換

[edit | edit source]

您將在本書中需要完成一項任務,也是計算機科學家經常需要完成的任務,即在十進位制數和二進位制數之間進行轉換。上一小節展示瞭如何將二進位制轉換為十進位制:將對應位為 1 的每個 2 的冪相加。

假設我們要進行十進位制到二進位制的轉換。例如,我們將十進位制值 75 轉換為二進位制。這裡介紹一種依賴於連續除以 2 的技術。

75/2   quotient=37   remainder=1
37/2   quotient=18   remainder=1
18/2   quotient=9    remainder=0
9/2    quotient=4    remainder=1
4/2    quotient=2    remainder=0
2/2    quotient=1    remainder=0
1/2    quotient=0    remainder=1

然後我們將餘數從下到上取,得到 1001011。由於我們通常以 8 位一組進行操作,如果它沒有填滿所有 8 位,我們在前面新增零直到填滿。所以最終得到 01001011。

二進位制數學

[edit | edit source]

二進位制數的加法

[edit | edit source]

除了儲存資料,計算機還需要進行加法等操作。我們如何在二進位制表示中加數字?

位的加法有四個簡單的規則,這裡用四列垂直表示

  0      0      1      1
+ 0    + 1    + 0    + 1
=========================
  0      1      1      10

現在,如果我們有一個由多個位組成的二進位制數,我們將使用這四個規則,再加上“進位”。以下是一個示例

  00110101
+ 10101100
==========
  11100001

這是同一個示例,但明確列出了進位,即沒有進位時為 0,有進位時為 1。當 1+1=10 時,0 保留在該列的解中,1 進位到左側的下一列。

  0111100
  00110101
+ 10101100
==========
  11100001

我們可以透過將每個數字轉換為十進位制來檢查二進位制運算:在二進位制和十進位制中,我們對相同的數字執行相同的運算,但使用不同的表示方式。如果表示和運算正確,結果應該一致。讓我們再來看一下上面我們剛解決的加法問題。將 轉換為十進位制得到 (自己進行轉換以驗證其準確性),將 轉換為十進位制得到 。將這兩個數字相加得到 ,當將其轉換回二進位制時,確實是

但二進位制加法並不總是完全正確

  01110100
+ 10011111
==========
 100010011  

注意結果中有 9 位,但一個位元組中應該只有 8 位。以下是十進位制的總和

  116
+ 159 
=====
  275

注意 275 大於 255,這是我們可以在 8 位數中儲存的最大值。這會導致一種稱為**溢位**的狀況。如果計算機可以轉換為 9 位二進位制數,溢位就不是問題;但是,如果計算機只為結果保留了 8 位,溢位意味著程式可能無法正常執行甚至無法執行。

二進位制數的減法

[edit | edit source]

再一次,讓我們從檢視單個位開始

  0      0      1      1
- 0    - 1    - 0    - 1
========================
  0     -1      1      0

注意在-1情況下,我們通常想要做的是獲得 1 結果並借位。因此,讓我們將其應用到一個 8 位問題中

  10011101
- 00100010
==========
  01111011

這與(以 10 為基數)相同。

  157
-  34
======
  123

以下是二進位制減法,借位已顯示

  1100010
  10011101
- 00100010
==========
  01111011

大多數人發現二進位制減法比二進位制加法困難得多。

[edit | edit source]

您可能對上一節中的二進位制表示有疑問。例如,負數呢?帶小數部分的數字呢?難道所有這些 0 和 1 對人類來說都不難處理嗎?這些都是好問題。在本節和其他幾個小節中,我們將研究在計算機科學中使用的一些與二進位制相關的其他表示方式。

十六進位制

[edit | edit source]

計算機擅長二進位制。人類不擅長。二進位制對人類來說很難寫、很難讀,也很難理解。但是,如果我們想要一種更容易閱讀的數字系統,同時又與二進位制密切相關,以便保留二進位制的一些優點,該怎麼辦?

一種可能性是十六進位制,即以 16 為基數。但是,使用大於 10 的基數會立即出現問題。具體來說,我們在 0 到 9 之後用完數字了——我們不能使用 10、11 或更大的數字,因為它們包含多個數字。因此,我們改用字母:A 代表 10,B 代表 11,C 代表 12,D 代表 13,E 代表 14,F 代表 15。因此,我們使用的數字是 0 到 F,而不是十進位制中的 0 到 9,也不是二進位制中的 0 和 1。

我們還必須重新審視每個位置的值。在十六進位制中,每個位置代表 16 的冪。一個兩位十六進位制數有一個 16 位和一個 1 位。例如,D8 在 16 位處有 D,在 1 位處有 8。

16^1  16^0  <- hexadecimal places showing powers of 16
16    1     <- value of these places in decimal (base 10)
D     8     <- our sample hexadecimal number

因此,十六進位制數 D8 等於 十進位制。請注意,任何兩位十六進位制數都可以表示與一個位元組二進位制資料相同的數量資訊。(這是因為最大的兩位十六進位制數 ,與 8 位二進位制相同。因此,它對我們來說更易於閱讀或寫入。

在處理數字時,有時使用哪種表示法並不清楚。例如,10 代表十(因此表示法為十進位制)、二(表示法為二進位制)、十六(十六進位制),還是其他數字?通常,表示法從上下文中可以明顯看出。但是,當不清楚時,我們會使用下標來澄清使用哪種表示法,例如 代表十進位制, 代表二進位制, 代表十六進位制。

十六進位制數可以具有我們已經看到的兩位以上的十六進位制數字。例如,考慮 ,它使用了以下 16 的冪。

16^7  16^6  16^5  16^4  16^3  16^2  16^1  16^0
F     F     0     5     8     1     A     4

因此,在十進位制中,它是:

十六進位制並不經常出現,但它在某些地方使用,例如有時用於表示記憶體地址(您將在後面的章節中看到)或顏色。為什麼在這些情況下它很有用?考慮一個 24 位 RGB 顏色,紅色、綠色和藍色分別為 8 位。由於 8 位需要 2 個十六進位制數字,因此 24 位顏色需要 6 個十六進位制數字,而不是 24 位。例如,FF0088表示一個 24 位顏色,紅色分量為全色,綠色為無,藍色為中級。

現在有更多型別的轉換問題。

* Decimal to hexadecimal
* Hexadecimal to decimal
* Binary to hexadecimal
* Hexadecimal to binary

以下是一些涉及最後兩個問題的示例。

讓我們將二進位制數 00111100 轉換為十六進位制。為此,將其分成兩個 4 位部分:0011 和 1100。現在將每個部分轉換為十進位制,得到 3 和 12。3 是一個十六進位制數字,但 12 不是。相反,回想一下,C 是 12 的十六進位制表示。因此,00111100 的十六進位制表示為 3C。

除了從二進位制轉換為十進位制(對於每個 4 位段),然後轉換為十六進位制數字之外,您還可以直接從二進位制轉換為十六進位制。

十六進位制數字及其十進位制和二進位制等效值:首先是 16 進位制(十六進位制),然後是 10 進位制(十進位制),然後是 2 進位制(二進位制)。

16 10  2 <- bases
===========
0  0   0000
1  1   0001
2  2   0010
3  3   0011
4  4   0100
5  5   0101
6  6   0110
7  7   0111
8  8   1000
9  9   1001
A  10  1010
B  11  1011
C  12  1100
D  13  1101
E  14  1110
F  15  1111

現在讓我們將十六進位制數 D6 轉換為二進位制。D 是 的十六進位制表示,它在二進位制中為 1101。二進位制中的 6 為 0110。將這兩個部分組合在一起得到 11010110。同樣,我們可以使用上面的十六進位制和二進位制列跳過中間轉換。

文字表示

[編輯 | 編輯原始碼]

一段文字可以被視為符號流,可以表示/編碼為一系列位元,從而生成文字的位元流。兩種常見的編碼方案是ASCII 碼和Unicode。ASCII 碼使用一個位元組 (8 位) 來表示每個符號,可以表示多達 256 () 個不同的符號,其中包括英文字母表 (大小寫) 和其他常用符號。Unicode 擴充套件了 ASCII 碼,使用多個位元組來表示更多符號。Unicode 可以表示任何書面語言中的任何符號,以及更多其他符號。

影像、音訊和影片檔案

[編輯 | 編輯原始碼]

影像、音訊和影片是其他型別的資料。計算機如何表示這些型別的資料非常有趣,但也複雜。例如,存在感知問題 (例如,人類能聽到哪些型別的聲音,以及這如何影響我們為了可靠地表示音樂而需要儲存多少數字?),大小問題 (正如我們將在下面看到的,這些型別的資料會導致檔案大小很大),標準問題 (例如,您可能聽說過 JPEG 或 GIF 影像格式),以及其他問題。

我們無法深入介紹影像、音訊和影片表示:細節過於複雜,而且可能非常複雜。例如,JPEG 影像可能依賴於一種稱為離散餘弦變換的先進數學技術。但是,值得考察關於影像、音訊和影片檔案的一些關鍵的高階要點。

  1. 計算機不僅可以表示基本的數字和文字資料,還可以表示諸如音樂、影像和影片等資料。
  2. 它們透過對資料進行數字化來實現這一點。在最低級別,資料仍然以位元的形式表示,但也有更高級別的表示結構。
  3. 有多種方法可以對這些資料進行編碼,因此標準編碼技術很有用。
  4. 音訊、影像和影片檔案可能很大,這在儲存、處理和傳輸這些檔案方面提出了挑戰。為此,大多數編碼技術使用了一些複雜的壓縮型別。

感知影像的形成是由於光束物理地進入我們的眼睛並觸發神經向我們的大腦傳送訊號。在計算中,影像透過一個點陣 (稱為畫素,代表“影像元素”) 來模擬,每個點都有特定的顏色。這是因為如果解析度 (使用的點數) 足夠高,我們的眼睛無法分辨原始影像和基於點的影像之間的區別。事實上,計算機螢幕本身就使用這樣的畫素點陣來顯示影像和文字。

"我們銀河系有史以來最大、最詳細的照片已經公佈。這張巨大的九十億畫素的影像捕捉到了銀河系核心超過 8400 萬顆恆星。它是由位於智利歐洲南方天文臺帕拉納爾天文臺的可見光和紅外巡天望遠鏡 (VISTA) 收集的資料建立的。該專案背後的團隊表示,如果以報紙的解析度列印,它將長 30 英尺,高 23 英尺,解析度為 108,200 x 81,500 畫素。"[5]

雖然這張銀河系影像顯然是一個極端的例子,但它說明了影像 (即使是更小的影像) 也可能佔用大量的計算機空間。這裡有一個更平凡的例子。假設您有一張寬度為 1500 畫素,高度為 1000 畫素的影像。每個畫素以 24 位顏色儲存。儲存這張影像需要多少位元組?

這個問題描述了一種直接但幼稚的儲存影像的方法:對於每一行,對於每一列,儲存該位置的 24 位顏色。答案是 個畫素乘以 24 位/畫素乘以 8 位/位元組 = 450 萬字節,約為 4.5 MB。

注意檔案大小。如果您儲存了許多照片或其他影像,您就會知道影像,尤其是影像集合,可能會佔用相當大的儲存空間。您可能也知道大多數影像不會佔用 4.5 MB。而且您可能聽說過一些影像儲存格式,例如 JPEG 或 GIF。

為什麼大多數影像大小是幾十或幾百 KB 而不是 MB?大多數影像不是以直接格式儲存的,而是使用某種壓縮技術。例如,假設您有一張夜間影像,影像的上半部分全部為黑色 ((0,0,0) 在 RGB 中)。與其在影像上半部分的畫素數量上多次儲存 (0,0,0),不如使用某種“速記”更有效。例如,與其在檔案中包含數千個 0,不如用 (0,0,0) 加上一個數字來表示從影像開頭 (如果從上到下逐行讀取) 開始有多少畫素具有顏色 (0,0,0)。

這將導致壓縮影像:包含原始影像中所有或大部分資訊的影像,但以更有效的方式表示。例如,如果原始影像會佔用 4 MB,但更有效的版本佔用 400 KB,那麼壓縮比就是 4 MB 到 400 KB,大約是 10:1。

複雜的壓縮標準,例如 JPEG,使用各種技術來壓縮影像。這些技術可能非常複雜。

影像可以壓縮多少?它取決於許多因素。對於許多影像,例如,壓縮比為 10:1 是可能的,但這取決於影像及其用途。例如,一個因素是影像的複雜程度。一個簡單的影像 (例如,作為極端的例子,如果每個畫素都是黑色的[6]),可以壓縮很多。更豐富、更復雜的影像壓縮得更少。但是,即使是複雜的影像通常也能壓縮至少一些。

另一個考慮因素是壓縮後的影像對原始影像的保真度。例如,許多使用者會為了更小的檔案大小而犧牲原始影像和壓縮影像之間的一些微小差異,只要這些差異不容易察覺。一種不丟失任何影像資訊的壓縮方案稱為無損方案。一種會丟失資訊的方案稱為有損方案。有失真壓縮比無失真壓縮效果更好,但會損失一些保真度。[7]

此外,影像的編碼還包括其他元資料,例如影像的大小、編碼標準以及建立日期和時間。

不難想象,影片可以編碼為一系列影像幀,並使用位元同步編碼的音訊軌道。

假設您有一個 10 分鐘的影片,解析度為 256 x 256 畫素,每個畫素 24 位,每秒 30 幀。您使用的編碼方式是為影片的每一幀的每個畫素儲存所有位元。總檔案大小是多少?假設您有 500 千位元每秒的下載連線;下載檔案需要多長時間?

這個問題突出了影片檔案的一些挑戰。注意檔案大小問題的答案是 (256x256) 畫素 24 位/畫素 10 分鐘 60 秒/分鐘 30 幀每秒 = 大約 28 Gb(Gb 表示千兆)。這大約是 28/8 = 3.5 千兆位元組。以每秒 500 千位的速度下載,這將需要 28Gb/500 Kbps,大約 56,000 秒。這超過了 15 個小時,比許多人願意等待的時間要長。如果每幀的畫素數更大(例如,在全屏顯示中)或影片長度更長,或者下載速度更慢,則時間只會增加。

因此,影片檔案大小可能是一個問題。然而,下載一個十分鐘的影片並不需要 15 個小時;就像影像檔案一樣,有一些方法可以減小檔案大小和傳輸時間。例如,MPEG 等標準不僅利用影像壓縮技術來減小單個幀的儲存大小,而且還利用了一個幀中的場景通常與下一幀中的場景非常相似這一事實。網上有很多關於各種壓縮技術和標準、儲存介質等的資訊。[8]

音訊

[edit | edit source]

乍一看,音訊檔案似乎不應該佔用像影片那麼多的空間。但是,如果你考慮音樂等複雜音訊的複雜程度,你可能不會對音訊檔案也會很大感到驚訝。

聲音本質上是振動,或是一組穿過空氣的聲波。人類可以聽到頻率在每秒 20 到 20,000 次迴圈之間的聲波。[9] 為了避免某些不良的偽像,音訊檔案需要使用兩倍於最高頻率的取樣率。因此,例如,對於 CD 音樂,通常以 44,100 赫茲或每秒 44,100 次進行取樣。[10] 如果你想要立體聲效果,你需要在兩個通道上取樣。對於每個樣本,你想要使用足夠多的位來儲存振幅,以提供忠實的表示。CD 通常使用每個樣本 16 位。因此,一分鐘的音樂需要 44,100 個樣本 16 位/樣本 2 個通道 60 秒/分鐘 8 位/1 位元組 = 大約每分鐘 10.5MB。這意味著一首 4 分鐘的歌曲大約需要 40MB,一小時的音樂大約需要 630 MB,這大約是一張典型 CD 的儲存容量。[11]

但是,請注意,如果你想透過 1Mbps 的連線下載一首 40 MB 的歌曲,則需要 40MB/1Mbps,大約需要 320 秒。這並不算很長,但如果可以更短就好了。因此,不出所料,有一些壓縮方案可以顯著縮短這個時間。例如,有一種 MPEG 音訊壓縮標準可以將 4 分鐘的歌曲壓縮到大約 4MB,這是一個很大的減少。[12]

表示的大小和限制

[edit | edit source]

在上一節中,我們看到一頁文字可能需要幾千位元組來儲存。影像檔案可能需要幾萬、幾十萬甚至更多位元組。音樂檔案可能需要數百萬位元組。電影檔案可能需要數十億位元組。有些資料庫包含數萬億或數千萬億位元組的資料。

計算機科學對大量的位元組有特殊的術語和表示法。以下是一個記憶體容量表,包括它們的 2 的冪和近似的美式英語單詞。

1 kilobyte (KB) —  bytes — thousand bytes
1 megabyte (MB) —  bytes — million bytes
1 gigabyte (GB) —  bytes — billion bytes
1 terabyte (TB) —  bytes — trillion bytes
1 petabyte (PB) —  bytes — quadrillion bytes
1 exabyte (EB) —  bytes — quintillion bytes

仍然存在更高的數量級或更小的數量級。[13]

千位元組、兆位元組和其他大小在討論檔案大小、計算機記憶體大小等方面非常重要,因此你應該瞭解它們的術語和縮寫。需要注意的是,檔案大小通常以位元組(或千位元組、兆位元組等)表示。但是,計算機科學中的一些數量通常以涉及位的術語表示。例如,下載速度通常以每秒位數表示。“Mbps”是兆(不是兆位元組)每秒的縮寫。請注意,Mbps 中的 'b' 是小寫的,而 MB(兆位元組)中的 'b' 是大寫的。

在計算機記憶體的上下文中,千位元組、兆位元組等的通常定義是 2 的冪。例如,一個千位元組是 位元組,而不是一千位元組。然而,在其他一些情況下,千位元組被定義為正好是一千位元組。這顯然會讓人困惑。本書中,這種差異通常並不重要。也就是說,在我們大多數情況下,近似值已經足夠接近。因此,例如,如果我們進行計算並發現一個檔案需要 6,536 位元組,那麼你可以說這大約是 6.5 KB,除非問題說明中另有說明。[14]

所有表示方法在多種方面都存在侷限性。首先,我們可以表示的不同事物數量是有限的,因為我們使用的符號組合的數量總是受到可用物理空間的限制。例如,如果您要透過在紙上寫下來來表示一個十進位制數,那麼紙張的大小和字型的尺寸限制了您可以寫下的位數。同樣,在計算機中,可以物理儲存的位數也是有限的。使用三個二進位制位,我們可以生成 個不同的表示/模式,即,它們通常分別代表 0 到 7。請記住,表示方法沒有內在含義。因此,三個位可以可能代表七個不同的東西。使用 n 個位,我們可以代表 個不同的東西,因為每個位可以是 1 或 0,而 是我們可以得到的總組合數,它限制了我們可以表示的資訊量。

另一種限制是由於表示方法的性質造成的。例如,三分之一永遠無法透過帶有小數部分的十進位制格式精確表示,因為小數點後將有無窮多個三。同樣,三分之一也不能以二進位制格式精確表示。換句話說,不可能將三分之一表示為二的冪的有限列表的總和。但是,在三進位制記數系統中,三分之一可以精確地表示為:,因為小數點後的 1 代表三的冪:

註釋和參考文獻

[編輯 | 編輯原始碼]
  1. 模擬 在 維基詞典 上。
  2. 實際上,這比這更復雜,因為一些裝置(包括一些數字廣播)混合了數字和模擬。例如,數字廣播可能以數字形式開始,即作為數字流,然後轉換為無線電波並以無線電波的形式傳輸,然後接收並轉換回數字形式。嚴格來說,訊號是調製解調的。如果您在計算機上有一個調變解調器調製器-解調器),它執行類似的功能。
  3. 實際上,我們不僅需要資料,還需要一種方法來表示計算機內的演算法。計算機如何儲存演算法指令將在另一章中討論。
  4. 當然,0 或 1 的表示方式因裝置而異。例如,在計算機中,區分 0 和 1 的常用方法是透過電氣特性,例如使用不同的電壓電平。在光纖電纜中,光脈衝的存在或不存在可以區分 0 和 1。光儲存裝置可以透過光碟表面位置上反射率影響的小“凹坑”的存在或不存在來區分 0 和 1。
  5. [1]
  6. 您可能見過現代藝術繪畫,其中整個作品都是單色。
  7. 例如,參見 [2],瞭解壓縮率和影像保真度之間相互作用的示例。
  8. 例如,參見 [3] 以及那裡的連結。
  9. 這只是一個粗略的估計,因為存在很多個體差異,以及影響此範圍的其他因素。
  10. Hz 或 赫茲,是頻率的測量單位。它出現在計算機科學、計算機工程以及相關領域(如電氣工程)的許多地方。例如,計算機顯示器可能具有 60Hz 的重新整理率,這意味著它每秒重新繪製 60 次。它也用於許多其他領域。例如,在大多數現代的音樂會音樂中,中音 C 上的 A 被認為是 440 Hz。
  11. 例如,參見 [4],以瞭解更多關於 CD 工作原理的資訊。一般來說,有很多關於音訊檔案、格式、儲存介質等的網站。
  12. 請記住,還存在 MPEG 影片壓縮標準。MPEG 實際上有一套標準:參見維基百科上的 運動影像專家組
  13. 例如,參見 二進位制字首
  14. 對於較小的位元組數,“圓”數(如一百萬)和 10 的冪之間的差異並不像對於較大的位元組數那樣明顯。一個千位元組是 個位元組,只比一千多 2.4%。一個兆位元組是 個位元組,大約比一百萬多 4.9%。一個吉位元組大約比十億多 7.4% 個位元組,一個太位元組大約比一萬億多 10.0% 個位元組。在我們做的大多數檔案大小問題中,我們將對近似大小感興趣,並且相差 2%、5% 或 10% 並不重要。當然,存在現實世界的應用程式,其中它很重要,因此在做檔案大小問題時請記住我們正在進行近似計算,而不是精確計算。
華夏公益教科書