一個故事講完CPU的工作原理
上二年級的小明正坐在教室裡。現在是數學課,下午第一節,窗外的蟬鳴、緩緩旋轉的吊扇讓同學們昏昏欲睡。此時,劉老師在黑板上寫下一個問題:
6324 + 244675 = ?
小明抬頭看了一眼,覺得這兩個數字挺眼熟。他昨天翹課去網咖了,因此錯過了劉老師講的豎式計算加法。
“同學們算一算這道題。”劉老師和藹可親地說道。
小明盯著黑板懵逼。
小學二年級的他面對這樣一道世界級難題,束手無策。小明伸出了自己的左手,打算用一個古老而深邃的方法--掰手指--嘗試一下。
小明發現他的每隻手只能輸入0-5中的正整數,和的範圍僅限於0-10,離6324還十分遙遠。
“慢著!”小明看向了自己的左手。他發現,事情有一點不對勁。
我們也來看看小明的左手。這隻左手有5根手指,我們把5根手指都伸開來記為11111,5根手指握拳記為00000,手背面向我們,左手小指是第一個1/0。
小明緊緊地握拳,然後伸出大拇指,此時的左手為00001。“如果,”小明想,“這樣是1”。
他縮回拇指,伸出食指,此時的左手為00010;“這樣是2”。
他又伸出拇指,此時的左手為00011;“那麼這樣是3”。
他縮回拇指和食指,伸出中指,此時的左手為對著自己豎中指00100;“這樣就是4!”
.....小明的左手飛速運動著,直到五根手指都伸直,像是鋼鐵俠射了一發掌心炮11111;“這樣就是31!一隻手可以表示0-31中的任意正整數!”
小明為自己的發現感到激動。可他不知道怎麼表示加法。
小明的同桌,英語課代表小紅,看他擺弄了半天左手,忍不住問他在幹什麼。小明解釋了他的發現。小紅聽了小明的一番高論,若有所思,提筆在數學書的封底畫了一個表格:
小紅畫的表格
“如果我們能造一個機器,給它三個輸入,它能返回兩個結果,那我們就能算出這道題!”小紅激動地說。
“啥叫進位啊美女?”小明問道。
“就是你列豎式的時候畫的一小撇”,小紅回答。
“獵術士是什麼,我知道獵魔人和古爾丹。”
小紅於是講解了一下怎麼列豎式計算十進位制加法。“我懂了。”
小明說著,拿過小紅的數學書,補全了表格:
小明試著補全表格
“是這樣嗎?”小明問小紅。
小紅拿過來看了看,說:“最後一行寫錯了,輸出結果應該是1。你想啊,1+1+1應該等於11,左邊這一位是輸出進位,右邊這一位是輸出結果,都是1,所以輸出結果應該是1。”
“噢。”小明又拿過書來,拿起橡皮鉛筆改正:
小明改好了
“那為什麼這個機器能算加法?我還是不懂。”小明問。
“假設我們已經造出來了這麼個機器,長這樣”小紅繼續在封底上畫著:
小紅畫的機器
“等會等會,怎麼變成英文了,我英語不好。”小明叫道。
“hmmm看來你沒讀雙語幼兒園。左邊這三個是輸入,右邊是輸出,C是進位,C-in是輸入進位,C-out是輸出進位,Sum是和的意思,明白了麼?”小紅解釋道。
“噢好。”
“假設我們已經造出來了這麼個機器,造了好幾個,我們這麼連起來...誒紙不夠大,我寫不下了。”
小明一聽,趕緊從書桌膛裡翻出來一本草稿紙,生怕同桌變成費馬。
“謝謝。先這麼連起來:”
小紅畫圖中
“哦哦哦我懂了,A和B就是兩隻手,最右邊這個one-bit-adder計算的是最小位數的和!”小明說道。
“正確!”
“你這樣連的話,是說最小位的輸出進位就是下一位的輸入進位,下一位的輸出又是下下一位的輸入!天啊,這跟列豎式好像。”小明驚叫。
“Absolutely!”小紅回答道。
小明又拿過草稿紙,接著畫起來:
小明畫圖中
“把對應的每一位連到每一個adder裡...”小明唸唸有詞,“...再彙總一下輸出”:
小明畫的加法器
“成了!這個東西可以算兩隻手加法的結果!”小明高興極了。
“可是離6324和244675還是太遠了,輸入5位遠遠不夠呀。”小紅皺了皺眉頭。
“不不不!你在掰手指的時候有沒有發現,每多一根指頭,能表示的數就會多出來一大堆,我覺得只要加那麼十幾個就夠了!1根指頭能表示2個數(0,1),2根指頭四個數(0,1,2,3),3根8個...”
“是2的倍數!”小紅接道,“小明,我覺得你的這個記數方法很有意思,要不叫小明式吧!”小紅凝望小明的目光中有了一絲羞澀。
“二進位制。”
身後忽然傳來低沉的聲音。兩人同時回頭,發現數學課代表小剛正直勾勾地盯著那張草稿紙。他好像已聆聽多時了。
“叫二進位制吧,我看藍貓淘氣三千問講過這個,一模一樣,藍貓說這是二進位制。”小剛補充道。
小剛的數學成績是班裡最好的,一進學而思就上的超常班。小紅只能上尖子班,小明一般去網咖。
“那就叫二進位制吧。”小明說。
他和小紅轉過身來,老師讓小組討論的時候他們就這麼坐。
小剛又道:“可是,怎麼造出這個one-bit-adder呢?”他的眉頭皺成一團,眼鏡片看起來更厚了。
小明和小紅也陷入了沉默,三人一籌莫展,陷入僵局。這時,小剛的同桌,物理課代表小蘭入局。
她忽然說道:“我聽物理辦公室的陳老師吹牛,他當年在大學裡讀電子工程,GPA一直是4.3,用實驗室的導線開關和小燈泡就能造一個32位的加法器,不知道是怎麼做到的。他還說什麼與門是and,或門是or,再加一個非門not,用它們表示邏輯,就能造出世間千千萬萬的計算機。”
小明聽迷糊了,“等會等會,什麼門?金拱門?”另兩人也露出迷茫的表情。
小蘭從桌子裡掏出一個黑盒子。“這是下節課要用的教具,陳老師讓我先拿著。”
她開啟盒子,取出三個零件和一個說明書。
“喏,你們看看這個”,她拿起第一個零件,“這個叫與門,有兩個輸入和一個輸出。如果我們把輸出連上小燈泡,接上電源,兩個輸入分別連上開關,那麼是這麼個情況:”
小蘭畫的表格
“就是說,只有兩個開關都閉合了,小燈泡才亮,有點像串聯電路。”小蘭補充道。
“誒,有意思了...”小剛扶了扶眼鏡,似乎打算說什麼,大家都看向他。
“沒,沒什麼,我還在想,小蘭你接著說。”
“那好。”小蘭接著拿起第二塊零件。“這個叫或門,有一個開關開著燈泡就會亮...”
“等下!”小剛忽然打斷,拿起筆在自己的白紙上畫起來:
小剛畫的表格
“是不是這樣!”小剛激動地說,“如果0是關1是開,0是滅1是亮的話,或門的輸入輸出是不是這樣?”
小蘭看了看道:“正是”。
她拿起第三個零件,“最後這個叫非門,只有一個輸入,一個輸出。它會輸出一個相反的結果:輸入有電流,輸出就沒有;輸入沒有電流,輸出就有電流。用小剛的話來說,輸入0輸出則為1,輸入1輸出則為0。太簡單了,懶得畫表了。”
小蘭把非門放在桌上。小剛說道:“這三個門可以表示三種邏輯。如果A、B是輸入, A or B 就是經過或門的結果, A and B就是經過與門的結果, not A 則是A經過非門的結果。”
三人紛紛點頭。“可是,這和加法有什麼關係呢?”小明問道。
四人再度陷入沉默。
沉默。
忽然,小明拿起筆,一邊畫一邊說道:“如果我們回去看小紅畫的表格,”
左三列是輸入,右二列是輸出
“Sum可以寫成A、B、Cin的邏輯關係!”
“你們看,把 A and B 記作 AB,A or B 記作 A + B,not A 記作 A 上面畫個橫線。Sum 輸出為1只出現在表格的2、3、5、8行,也就是三個輸入中1的個數為奇數的時候。我們把這4種情況記下來,那麼這個式子...”
“可以拿邏輯閘實現!!!”四人異口同聲的叫道。
小紅搶過草稿紙,又看了看物理教具的說明書,邊畫邊說了起來:“說明書上寫,這個火車頭形狀的符號表示 and gate;這個B2轟炸機形狀的是or gate;這個小人形狀的是not gate...”
小紅畫的與門,或門,非門
她又看了一眼小明的式子,說道:“這個式子的第一項可以這樣...”
小紅畫的輸出和的第一項
"你們看你們看,這個不就是
嘛!"小紅自豪地說。
小明補全了電路:
“先把與門都畫了”
“再把或門都加上,搞定。這東西可以算出Sum了,接下來用一樣的辦法把C-out弄出來。”小明準備繼續畫。
“你們看,這裡還有幾個零件。”小蘭指著說明書說道:
與非,或非,異或,同或
“與非門:一個與門的輸出和一個非門相連,英文是not and,NAND gate。那個小圈圈代表一個非門。
或非門是或門 + 非門,not or,NOR gate。
第三個叫異或門,只有兩個輸入中一個為1一個不為1時,才會輸出1,exclusive-or,XOR gate。
第四個是同或門,也就是一個異或門加上一個非門。”
“啊哈!”小剛靈機一動,抓起筆來道:“我有一個絕妙的點子。”
小剛簡化後的電路
“小明的方案,要用17個門。我只要2個異或門就搞定了,牛逼吧?”
三人瞪大了眼睛,仔細思考後紛紛點頭道:“牛逼,牛逼。”
小剛隨機畫出了完整的one-bit-adder電路:
小剛的one-bit-adder
小明從從教具盒裡拿出電源、小燈泡、開關和邏輯閘,按照設計圖製作出了全加器:
看到小剛的設計被完整的實現,小明欣喜:“啊哈哈哈,吾有上將小剛,則霸業可成,漢室可興啊!”
他把黑盒子裡的零件全拿了出來,四人忙碌地工作著。很快,他們擁有了5個全加器,基於小紅的設計連了起來:
小紅設計實現
“二進位制的01100等於十進位制的12,01010等於10,12+10=22,等於16+4+2,也就是二進位制的10110...”
四人人往代表輸出結果的5個小燈泡望去:亮,滅,亮,亮,滅;正是10110!
“成了!!!”
大家激動的拍打課桌為了計算黑板上那道題,四人一共製作了32個一位全加器,將它們連線後,一個三十二位加法器便誕生了。
他們歷經艱辛,踩著自然規律和人類智慧的肩膀,把自己從枯燥的加法計算中解放出來!
窗外的蟬鳴漸漸平息,頭頂的吊扇不再轉動。
“劉老師,答案是250999!”小明站了起來,聲若洪鐘大呂,震懾天地。
他和小紅、小剛、小蘭分別對視了一眼,收穫了堅定的目光。
這目光,連同面前的32位加法器,如同新的轉機和閃閃星斗,正在綴滿沒有遮攔的天空。
劉老師點了點頭,欣慰的說道:“很好,看來四位同學對這部分知識掌握的不錯!我們再來看幾道題!”
他轉過身,拿起板擦,把黑板擦了個精光,又從黑板槽裡拾起半截粉筆,寫了起來:
1. 244675 - 6324 = ?
2. 3.14159 + 5.535897 = ?
3. 17 * 45 = ?
4. 3 / 2 = ?
一連四道題,讓四人組陷入了深思:如何讓自己的機器運算減法?乘法?除法?浮點數?
劉老師並沒有停下,手中的粉筆運動得越來越快:
5. Fibonacci 數列的第103項?
6. 一圈共有N個人,開始報數,報到M的人出列,然後重新開始報數,問最後出列的人是誰?.
.....
疑惑越來越多了:如何儲存?怎樣實現分支?保證效率?
劉老師仍未停下,黑板快被寫滿了:
103. 方程ζ(s)=0的所有有意義的解都在一條直線上嗎?
104. 大於2的偶數都可以寫成兩個質數的和嗎?
......
134. 生命,宇宙及所有事物的答案?
劉老師放下了粉筆,半截粉筆已經變成硬幣的厚度。
“這些問題,我們能造個機器回答麼?”小明撐著頭,喃喃自語。
來源:知乎(已獲授權,連結見閱讀原文)
作者:柳兩叢
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31561266/viewspace-2674586/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一個故事看懂CPU的TLB
- 一個故事看懂記憶體條工作原理記憶體
- 一個故事看懂AI神經網路工作原理AI神經網路
- 一個故事看懂CPU的SIMD技術
- 一個故事講完程式、執行緒和協程(作業系統基礎知識)執行緒作業系統
- 一個故事看懂機械硬碟原理硬碟
- 一個小故事,講透精益管理本質!
- 作為非IT行業大企裡的程式設計師,我講一個自己工作上的故事行業程式設計師
- 老爸講的故事
- 【5000字長文】從 S3 到 DataZone,亞馬遜雲科技用16年講完一個資料的故事S3亞馬遜
- 「MoreThanJava」一文了解二進位制和CPU工作原理Java
- 《十三機兵防衛圈》用好的方法講了一個好故事
- 從《旅行串串》看小遊戲如何講述一個好的故事遊戲
- Splendy Games:一個獨立工作室的失敗警示故事GAM
- 如何在Rogue-Like遊戲裡講好一個故事?遊戲
- 《Arise:一個平凡故事》Polygon:一個悲喜交加的平凡故事Go
- 講故事的餛飩仙人
- 講一個程式設計師如何副業月賺三萬的真實故事程式設計師
- 《Unpacking》的開發者如何用1000件物品講述一個遊戲故事?遊戲
- 一個非侵入的Go事務管理庫——工作原理Go
- 淺談一個與彼得原理和責任管理有關的小故事
- 全面解釋人工智慧LLM模型的真實工作原理(完結)人工智慧模型
- CPU 的工作原理 [國外資料][PHPER 碼農來速來圍觀一波]PHP
- 當遊戲試圖在娛樂之外,講一個深度故事時遊戲
- [譯] Slidable:一個 Flutter 的故事Flutter
- 用一個實際例子理解Dockervolume工作原理Docker
- 《遺忘之城》:在時間迴圈的框架下,講一個引人深思的故事框架
- 關於cpu體系架構的一些有趣的故事分享架構
- 一群背井離鄉的伊朗人,講了一個關於愛與家庭的故事
- 一段對話講完建造者模式模式
- 一個隱喻故事
- 一個故事看懂HTTPSHTTP
- 在一款音樂遊戲裡講個好故事,真的可以嗎?遊戲
- 用一個實際例子理解Docker volume工作原理Docker
- 述說韻達快遞小哥的故事,致敬每一個平凡工作的普通人
- 一個保險廣告的故事
- 如何講好資料管理的故事
- 用UI講故事,表達情感和創造個性UI