低并發編程,周一很頹廢,周四很硬核
我和小宇早戀了,我們家住隔壁。
一、編碼與電路——信號的轉換
晚上父母會把手機沒收,但我們還想繼續聊天,又不敢發出聲音,于是我們想到了這個辦法...
我們把所有的中文都用燈泡的亮滅組合來表示,同時約定好每隔一秒讀取一次燈泡的狀態并記錄下來,這是我們的暗號。
我:亮亮滅滅亮
喜:滅亮亮滅滅
歡:亮滅亮滅亮
你:亮亮亮滅滅
這樣,我們雖然沒有了手機,依然可以日以繼日地聊天,雖然效率很低,但依然很快樂。
我和小宇就這樣在不經意間,將語言轉換成為了燈泡的亮滅組合,這個過程叫做編碼。
二、門電路——信號的關聯
我和小宇就這樣一直秘密保持著通話,直到上了大學,父母再也管不了我們用手機了。
但這么多年的小燈泡通話,使我們總覺得事情沒那么簡單,于是我們開始了一些新的探索。
我們增加了一個開關。此時當兩個開關同時閉合時,燈泡才會亮。
這樣兩個開關與燈泡之間,不再是之前簡單的對應關系了,而是有了邏輯。
開關的斷開與閉合分別對應著電路的斷開與連通。而小燈泡的不亮與亮,也分別對應著電路的斷開與連通。那這兩者就可以統一,不再依賴于具體的實物表現了。
還有,開關的連通與斷開,是主動的。而小燈泡的連通與斷開,是被動的,是結果。
我們把開關這里的連通與斷開稱為輸入端,把燈泡的連通與斷開稱為輸出端,并且將整個電路都封裝在一個圖形里,可以得到如下抽象:
我們決定把這種電路叫做門電路, 上面這個叫與門。
為了今后更為抽象的探索,我們將電路連通表示為數字 1,電路斷開表示為數字 0。
我們將這種表示方式稱為二進制。
輸出
0
0
0
0
1
0
1
0
0
1
1
1
慢慢地,我們發現了越來越多的玩法。
上面這種電路,我把他抽象成如下門電路形狀,叫做或門。
之后便一發不可收拾,我和小宇設計了越來越多的門電路,我們發現,只要是我們能想到的邏輯關系,都可以設計成對應的門電路。
三、加法器——信號的計算
十進制數可以轉換成二進制數,而二進制數又可以對應到門電路的輸入端與輸出端。
于是我和小宇有了一個大膽的想法,能不能設計一個計算加法的電路呢?
我們首先從最簡單的一位二進制數相加開始:
0+0=0;0+1=1;1+0=1;1+1=10
變成一張表格如下
加數 A
加數 B
加和輸出
進位輸出
0
0
0
0
0
1
1
0
1
0
1
0
1
1
0
1
即我們需要設計出一種電路,可以達到表中的輸入與輸出效果。
經過不懈努力,終于發現這個電路可以由異或門和與門兩個門電路組成。
這個裝置實現了二進制的一位加法,但它并不完美,因為只考慮了這兩個數的進位輸出,但沒有考慮上一位的進位,所以只能叫半加器。
如果將前一個進位考慮進來,只需再多一個半加器,并且拼接一個或門即可。
此時我們已經建立好了一個完美的一位加法器,并自豪地稱之為全加器。
全加器做出來之后,無論多少位的加法器就都可以做出來了,只需將全加器逐個拼起來即可。我們嘗試做一個八位加法器。
OK,大功告成,有了加法器,理論上就可以實現任何的數學運算了。
因為我們知道乘法可以轉換成加法,除法可以轉換成減法,而減法又可以轉換成補碼的加法?,F在我們可以自豪地稱這個部件為,算術邏輯單元 ALU。
四、時鐘——信號的震蕩
我和小宇都非常高興,終于用電路的方式實現了計算功能。
但慢慢的覺得沒什么意思了,于是我們又突發奇想,設計了如下詭異的電路。