只會做加法的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 00000000add ax,1 機器碼是050100, 實際是00000101 00000001 00000000add 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.bmpI. 圖片的存儲格式
請看地址提供的這張圖以二進位形式打開為這只是前面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中設備節點是設備文件嗎?