標籤:
怎麼由邏輯電路實現二進位的加法
首先二進位的加法可以拆解為兩個步驟:加與進位。
加這一步驟可以由異或門來完成,進位這一步驟則可以用與門來完成。
但是由這兩個邏輯門只能組成一個半加器,輸入2個值,輸出加和位與進位。這是不夠的,除了最低位的加法不需要進位配合,其他位上的加法都要進位、加位與被加一起輸入。
所以需要能有3個輸入2個輸出的全加器。這可以由兩個半加器組成。
減法的實現
我們可以用加法器來實現減法,首先來一次簡單的數學推導。
253 - 176
=> 253 -176 + 1000 - 1000
=> 253 - 176 + 999 + 1 - 1000
=> 253 + (999-176) +1 - 1000
(999 - 176) 可以稱作176對9的補碼,這樣如果我們忽略-1000(確實可以忽略,因為假如我們這的輸出位只有3位那麼第四位上的1是不被輸出的),那麼用三的加法就可以完成一個減法運算。
(999-176) +1 則可以稱作是對10的補數。
這是十進位下的推導,同樣在二進位下一樣成立。、
所以對一個數的減法可以加上這個數的補碼(二進位就是對2求補,十進位就是對10求補)即可。
如何?儲存
有種電路有兩種穩態,可記錄二進位制數字訊號“1”和“0,這就是觸發器。
基本RS觸發器又稱SR鎖存器,是觸發器中最簡單的一種,也是各種其他類型觸發器的基本組成部分。兩個與非門或或非門的輸入端輸出端進行交叉耦合或首尾相接,即可構成一個基本RS觸發器。
如何?定址
要實現一個最基本的儲存器,光光只有儲存功能還不夠,還要能有選擇的儲存與讀取功能也就是要有定址能力。
假如我們有32位二進位來定址,那麼我們能選擇232個單位的資料,如果一個單位的資料是一位元組,那麼32位定址端的最多能儲存大約是4GB的資料。這也是為什麼隨著電腦的記憶體越來越大,我們要換成64位的CPU與系統。因為超過4GB的儲存,32位是無法定址到的。
為什麼是位元組與十六位進位
在早期的加法器中的位寬就是8位,現在用位元組表示一組8位元資料。
一位元組由於有8位,其取值範圍為00000000到11111111,也可以表示0~255之間的正整數,通過補碼也能表示-128~127範圍內的正、負整數。雖然一個8位的二進位10110110自然並直觀,但不夠簡潔。這是我們就可以使用十六位進位來表達。一個十六位進位的數能表達4位二進位即半位元組。所以一個位元組只需要2個十六位進位就行,10110110就可以拆分成1011與0110,即b6h(h表明這是一個十六位進位的數)表達。
怎麼實現自動操作
首先我們要有一個振蕩器,它能在不需要人工幹涉的情況下自動輸出0與1。其經常被稱為時鐘,因為通過震蕩可以進行計時。一個迴圈(cycle)就是振蕩器從某個初始狀態經過一段時間又回到先前的初始狀態的這一段時間,又稱為一個周期。周期的倒數就是這個震蕩器的頻率(frequency),例如20Hz就是指振蕩器每秒產生20次迴圈。
我們能利用振蕩器實現一個計數器,能迴圈計數。例如一個16位的計數器能累積000h~ffffh。
儲存在RAM中的代碼分為2種:一種是指令,讓電路執行何種操作,其往往包含要操作資料的地址。另一種是資料,要被執行的代碼。
計數器是種能連續累加的電路,但RAM中儲存的代碼往往不是連續的,那麼我們需要一種方法能重新選擇開始執行代碼的位置的指令,即jump,通過重設計數器便可以實現。
什麼是匯流排
匯流排(Bus)是指電腦群組件間正常化的交換資料(data)的方式,即以一種通用的方式為各組件提供資料傳送和控制邏輯。從另一個角度來看,如果說主板(Mother Board)是一座城市,那麼匯流排就像是城市裡的公用汽車(bus),能按照固定行車路線,傳輸來回不停運作的位元(bit)。這些線路在同一時間內都僅能負責傳輸一個位元。因此,必須同時採用多條線路才能發送更多資料,而匯流排可同時傳輸的資料數就稱為寬度(width),以位元為單位,匯流排寬度愈大,傳輸效能就愈佳。匯流排的頻寬(即單位時間內可以傳輸的總資料數)為:匯流排頻寬 = 頻率 x 寬度(Bytes/sec)。
PC上一般有五種匯流排:
- 資料匯流排(Data Bus):在CPU與RAM之間來回傳送需要處理或是需要儲存的資料。
- 地址匯流排(Address Bus):用來指定在RAM(Random Access Memory)之中儲存的資料的地址。
- 控制匯流排(Control Bus):將微處理器控制單元(Control Unit)的訊號,傳送到周邊裝置,一般常見的為USB Bus和1394 Bus。
- 擴充匯流排(Expansion Bus):可串連擴充槽和電腦。
- 局部匯流排(Local Bus):取代更高速資料轉送的擴充匯流排。
定點數與浮點數
首先我們來介紹下BCD碼(Binary-Coded Decimal),是一種二進位的數字編碼形式,用二進位編碼的十進位代碼。用4位位元來表示1位十進位數中的0~9這10個數位。由於2的補數不於BCD碼一起使用,所以BCD碼需要增加一位來表示負數。
例如-4,325,120.25可以表示為如下5個位元組:
00010100 00110010 01010001 00100000 00100101
14h 32h 51h 20h 25h
在上面的例子中,小數點位置在2位小數之前。關於小數點位置的資訊並沒有儲存在數字中,它的位置是固定的。
基於這個二進位的儲存和標記方式就是定點格式(fixed-point format)。
顧名思義,浮點數就是其小數點的位置不確定。其二進位的儲存方法如下:
sign是符號位,exponent是指數位(單精確度8位,雙精確度11位),fraction是有效位(單精確度23位,雙精確度52位)。
這是不是很像我們平時用到的科學計數法。
但這種方法會帶來一個問題,就是在有效位超過一定時會有精度問題。
console.log(9007199254740992 === 9007199254740993); //trueconsole.log(9007199254740992 === 9007199254740994); //false
是的,這相等。
因為 前兩者都會被儲存為 1.000...(52個零)×253
9007199254740994 則會被儲存為1.000...0001×253 。
其影響精度的因素是有效位元,在雙精確度的條件下有效位是53位(包含了符號位),由於210~103,所以雙精確度下能保證15位的十進位有效數,單精確度則是7位。
《Code:The Hidden Language Of Computer Hardware and Software》 ——筆記