最近看了一本書《編碼》,如何從頭開始構建一台計算機。從最基礎的莫爾斯編碼到二進位制,基礎電路和布林邏輯運算的神奇結合。產生了目前人類最偉大的發明-計算機。
二進位制的提出者是德國數學家萊布尼茨,他和牛頓發現了高等數學中的微積分。用二進位制記數只需要用到0和1兩個符號,逢二進一。我們一般習慣了十進位制,用0-9十個符號來表示數,逢十進一。二進位制和十進位制記數原理相同,僅僅是符號用的少。
下面是二進位制和十進位制0-10的對照表。
十進位制二進位制00
11210
3114100
5101
6110
7111
81000
91001
101010
所有男人都必有一死;蘇格拉底是男人;因此,蘇格拉底會死。類似代數,布林運算符號為:and、or、not。在計算機中的邏輯運算中也叫與、或、非。運算元不是一般的數字,而是集合。
邏輯運算且滿足一般代數運算的交換率、結合率和分配率。
and
and01
0001
01or
or01
0011
11not
not01
10三種最基本的門
輸入輸入輸出0
0001
0100
111----
----
----
----or0
0001
1101
111------
------
------
------
not011
0或非門(nor)
與非門(nand)
輸入輸入輸出0
0101
0100
110------
------
------
------
nand00
1011
1011
10
摩根定律('+'為or,''為and)只要造出了加法器,就可以通過加法得到減法、乘法和除法;再進行冪運算,解方程.......
在數**算裡,
0加0等於0;
0加1等於1;
1加0等於1;
1加1等於0,進製為1。
注意到,我們的運算結果和上面的幾個邏輯門中的都不滿足,但是見證奇蹟的時刻到了。我們可以把計算的結果分為兩部分,一部分為加法結果,一部分為進製。然後再把進製結果進行二次相加,以此反覆,最終就可以得到結果。
只要我們的邏輯門足夠多,就可以計算任意大的數。這裡我採用的是8位的二進位制數,兩個八位的進製數和最大為11111111+11111111=111111110,在十進位制裡為510。也就是說可以計算510以內的任意加法(整數)。
當我們把乙個或門、乙個非門和與非門連線起來,得到異或門
輸入輸入輸出0
0001
1101
110 通過異或門,可以得到加和輸出,進製輸出直接通過與門就可以得到。
為了看起來簡單一點,把異或門表示為如下
當我們把乙個異或門和與門連線起來,就可以計算一位的二進位制數。
乙個加法器的輸入輸出:
輸入a輸入b
進製輸入
加和輸出
進製輸出00
0000
1010
1001
0110
0100
1100
1101
1010
1111
11把八個全加器連線起來,就得到了乙個加器。
二進位制加法運算
兩個二進位制整數相加時,是位對位處理的,從最低的一對位 右邊 開始,依序將每一對位進行加法運算。兩個二進位制數字相加,有四種結果,如下所示 0 0 0 0 1 1 1 0 1 1 1 10 1 與 1 相加的結果是二進位制的 10 等於十進位制的 2 多出來的數字向更高位產生乙個進製。如下圖所示,兩...
二進位制加法運算
兩個二進位制整數相加時,是位對位處理的,從最低的一對位 右邊 開始,依序將每一對位進行加法運算。兩個二進位制數字相加,有四種結果,如下所示 0 0 0 0 1 1 1 0 1 1 1 10 1 與 1 相加的結果是二進位制的 10 等於十進位制的 2 多出來的數字向更高位產生乙個進製。如下圖所示,兩...
php 實現二進位制加法運算
php實現二進位制加法 思路 沒有工作中應用過此場景,但十進位制的加法還是經常做的,能不能用十進位制加法變相實現呢?答案是可以的,並且php也提供進製間轉換的函式,我的實現使用了 bindec 二進位制轉十進位制 decbin 十進位制轉二進位制 function binplus arg1,arg2...