只會做加法的CPU如何將二進位文件和字母,圖片,聲音,甚至視頻聯繫起來?

順帶個小問題 有二進位編程指令嗎? 如何用二進位寫個計算1+1值的程序?


要系統地學這個原理確實要至少一學期,但科普的話應該不用那麼久。我來試試看。

究其根本,只認識二進位的CPU能搞定文字圖像聲音視頻等多種媒體,是因為前人發明了很多種用二進位數據來表示多媒體信息的標準。之後,程序員們寫出了按照這些標準來讀取、解析文件的程序。

文字:有若干種標準可以用8~16位二進位數表示一個字元,比如用8位數表示英語字母數字的ASCII,用16位數表示幾乎所有語言所有字元的Unicode等。以ASCII為例,這個標準用01000001這個數表示大寫的A,於是某個文字處理軟體看到這個數字知道這是A,然後向一個字體文件詢問字母A長什麼樣,然後把它畫在屏幕上,你就看到了A。

圖像:最簡單的格式叫「點陣圖」(BMP),用24位二進位數表示圖像中的一個點,這24位數中8位表示這個點有多少紅色,8位表示多少綠色,8位表示多少藍色,三種原色組合起來就可以表示幾乎所有的顏色。很多個24位數連在一起,就是很多個點,於是就組成了一幅圖像。除此以外還有其他格式以更少的數字表示同樣多的圖像內容,如JPG、PNG等。

聲音:聲音是波,是數學上的連續函數,而計算機無法理解連續函數,所以每秒取樣44100次,把1秒的聲音變成44100個數字記錄下來,這是錄音的過程。回放時,把這些數字交給音效卡,音效卡控制喇叭按照這些數字表示的幅度震動,就發出了聲音。同樣,除了44100個數字(這是WAV格式)以外還有其他格式以更少的數字表示同樣多的聲音,如MP3、OGG等。

視頻:既然有了圖像和聲音的標準,那麼每秒鐘24~60幅圖像再加上1秒鐘的聲音就組成了1秒鐘的視頻內容。不過這種做法的數據量異常龐大,所以沒人這麼干,科學家們發明了各種編碼方式以非常非常少(相對於未壓縮)的數字表示同樣多的視頻內容,如H.264等。

各種軟體控制CPU按照各種標準理解了多媒體內容後,計算出屏幕上每一個點應該是什麼顏色(和點陣圖一樣),然後把這些計算結果交給顯卡,顯卡把這一堆數字表示的顏色畫到屏幕上,這叫做一次刷新。一般來說每秒刷新60次,這樣你就流暢地看到了你所打開的多媒體內容。

至於順帶的小問題,其實CPU所做的事情不是做加法,而是執行指令。這個指令可以是加減法等算數,與或非等邏輯運算,也可以是跳轉、條件判斷等程序相關的指令。所以,有二進位編程指令,我們稱之為「彙編」。彙編碼怎麼寫,什麼數字表示什麼指令,指令是怎樣的格式,這是做CPU的廠家定的。以intel的x86為例,一個簡單的加法指令是:
00000100 00000101
其中00000100表示「把後面那個數加到AL寄存器里」的指令,後面那個數是十進位的5。於是這條指令可以讓AL寄存器的內容增加5。寄存器這東西理解成「CPU裡面的內存」就可以了。

程序員們很少用彙編碼寫程序,因為這東西太麻煩了,大多數人都用C、Java等簡單很多的語言來寫程序。但CPU除了彙編碼什麼都不認識,所以我們又發明了「編譯器」來把其他語言的程序翻譯成彙編碼的程序。

為方便科普而有些地方寫得不嚴謹,還請諒解。

更新:比如我竟然把彙編和機器碼搞混了。CPU直接執行的二進位代碼叫做機器碼,彙編是程序員為了方便寫機器碼而發明的一套助記符,和機器碼接近於等價,但也要翻譯成機器碼後才能執行。比如彙編代碼"ADD AL, 5"對應於機器碼"00000100 00000101"。


前面幾個答案講了一堆演算法和計算機原理的東西……我覺得題主未必能看明白,嘗試著深入淺出的講一下吧。

1. 四則運算歸根結底就是加減法的組合。

對於這一條我覺得任何學完小學數學的人應該都能理解。簡單來說,加/減法是最基本的部分,其中減法又可以看作是負數的加法,因此兩者實際上是可以統一到加法之下的。

乘法和除法是對連續加減法的簡化,因此其本質依然是加法,只需要適當的展開就可以用加法取代。

乘方/開方是對連續乘法的簡化,因此依然可以展開成乘法,然後再進一步展開成加法。

因此,用最簡單的語言來說,計算機所作的加法計算,本身就已經可以覆蓋到日常生活中大多數基本的算數運用了。

2. 電腦中的圖片、音頻和視頻本質上就是一堆數字。

我們常說「數字化」,所謂的數字化,也就是如其名所言,用數字來描述信息。

怎麼描述呢?其實很簡單。

拿圖片來說,我們知道光的三原色是紅、綠、藍。那麼先將圖片拆成許多的小點(像素),然後描述每個像素中,紅綠藍的值分別是多少,就可以完整的描述圖片了。

音頻的話類似。我們知道聲音是頻率和振幅的組合,那麼只需要用數字描述頻率和振幅的數值,就可以來描述一個聲音。

至於視頻,把圖片和聲音放在一起,然後再為圖片的部分加上一個時間軸,幾分幾秒幾毫秒的時候播放哪張圖片,本質上是和動畫片一樣的。

綜其上所述,計算機所作的,其實就是用數字來描述各種東西,並且把各種複雜的運算展開成最最基本的加法運算而已。


你得明白

1.cpu不知道自己在幹嘛

2.cpu不是在做加法

3.cpu本質還是電路,只是這些信號最終表現出一種邏輯形式

4.如果什麼事情能轉變為電信號表達,就存在程序控制的可能。


你說大學裡用一學期講明白的事情,怎麼可能一兩句話說明白...


我用以8086彙編給你解答(彙編學的爛說的不對輕噴)

1+1=2計算機內部需要2條指令

mov ax,1

機器碼是EB0100,

實際是11101011 00000001 00000000

add ax,1 機器碼是050100,

實際是00000101 00000001 00000000

add ax,1指令等價於ax寄存器=ax+1,

其實就是00000001+00000001,

更具二進位加法,逢二進一,就是00000010,十進位就是2了。

減法其實加法運算,負數用補碼錶示,1-1=0,就是00000001+11111111,更具逢二進一,就是1 00000000,1為符號位,也就是-0=0,,乘法,除法也用加法模擬,比如3*2,可以使把3累加兩次或把2累加3次數據的傳遞,內存地址定址和讀寫,則是通過CPU的三條匯流排,數據匯流排,地址匯流排和控制匯流排,地址加法器等完成。

還有什麼圖像,你把他顯示器理解成無數個小燈,通過電路讓一部分不亮一部分亮。不就出現圖像了嗎(雖然這樣說不太對)


因為二進位本質上是一種表示數據的方法

用某個值來定義某個字母

用某個值來定義某個數字

用某個值來定義某個符號

用某個值來定義某個顏色

用某個值來定義某個聲音

用某個值來定義某個操作

……

(這些都可以稱為元數據)

然後通過組合,表達更多的數據

二進位可以表示某個數據,組合後可以表示大量信息

將存儲在硬碟上的大量信息,通過不同的編碼,調用硬體,來顯示在顯示器或通過音響發出聲音

其實只要理解,數據是一回事,而顯示是另外一回事就好了


先簡要糾正一下題目。

1.CPU組成包含運算單元與控制單元

2.加法器在運算單元

3.CPU有一套指令集,可以控制數據的存儲、訪問。

——慢——慢——更——新————

以圖片舉例

Lena http://www.eecs.qmul.ac.uk/~phao/CIP/Images/LenaRGB.bmp

I. 圖片的存儲格式

請看地址提供的這張圖

以二進位形式打開為

這只是前面16*16個位元組。以及下圖的最後兩行。

下圖是BMP格式的圖片的文件頭和信息頭的結構,在第五列可以對應著上面的圖來看具體的對應的二進位信息。

紅色框框之後的都為圖像的具體數據。

II. 虛擬存儲器與文件系統

loading...(等我複習一遍……)

III. 彙編與指令集

loading...(等我把彙編-&>機器碼-&>微指令 複習一遍……)

IV. CPU的簡單運行過程

loading...(等我把上面複習完……)


用這個圖簡單示意一下,列出了從文件到晶體管的層次(笑)。在不考慮具體編碼及壓縮方式的情況下,用最簡單原始編碼方式表示了信息的層層實現方式,從自然信息到二進位信息,其中關鍵一步單元信息(字元/像素/音頻)的二進位編碼方式最為重要,也就是一個模擬轉數字的數字化過程。按這個方式簡單算存容量的話1位元組(byte)=8比特(bit),1個字元的容量是1或2byte,1張圖片(按800*600)的容量是1.44MB,1秒的視頻(按30fps、800*600)的容量是43.2MB,1秒的音頻(按2聲道*40kHz)的容量是80KB。


因為他們都是二進位的


推薦閱讀:

電腦開機後卡,過一段時間後又不卡了?
機器學習進階的五個境界
為什麼即使世界最知名的軟體程序,也無法阻止被人破解的命運?
linux中設備節點是設備文件嗎?

TAG:編程 | 計算機 | 編程學習 |