如何在mc里打造一個計算器[2] -- 加減法器

在第0篇的結尾我說到了一個叫半加器的東西, 它可以處理兩個1bit輸入的加法, 并且輸出一個本位和進位? ? such:? 輸入 1, 1? ?輸出 1, 0,? ? 其中輸出為1的叫做進位, 輸出為0的叫做本位
半加器在mc里有很多種實現(xiàn)方法, 不過主要還是分為兩種,? 兩個輸入端在水平方向一致,?和在垂直方向一致,? 這里有兩個例子? (第二個是借鑒別人的)



一般來說我還是推薦使用垂直方向的, 因為mc的紅石特性使得橫向占地很大, 而使用水平方向的只會讓你的計算器占地更大從而造成大量卡頓? ?(心累.jpg)

有了半加器之后, 可以開始著手制作簡單的加法器了
半加器其中有一個進位, 這說明進位需要留著下一個bit處理??*下一個一般指的是左邊的, 但是半加器只有兩個輸入,? 兩個本位輸入加上上一位進位一共3個輸入,? 所以我們需要一個新的部件處理3個輸入的加法
現(xiàn)在我們假設3個輸入都是1,? 那么加起來就是3, 也就是二進制的11,? 可以看出在極限情況下輸出也只有2個, 一個進位一個本位,?
那么這種處理三個輸入的加法部件就可以做為這樣:


AB是兩個本位輸入, S_bar是上一位的進位,? S是進位輸出, C是本位輸出
這個部件就叫做全加器, 把全加器串起來就是一個通用的加法器了:

那么現(xiàn)在我們就實現(xiàn)了最簡單的 A+B 加法操作了

那么減法如何實現(xiàn)呢
A-B可以看作A+(-B), 而-B可以看作0-B,? 那么問題來了, 如何進行0-B這個操作?
先來舉例子:? ?-1 + 1 = 0,? ?而在4bits里, 1表示為0001,? 那么我們需要尋找一個數(shù)字B`, 使得B` + 0001 = 0000,? 這明顯在二進制是不存在的,? 但是如果我們考慮溢出整形的話?
那么上述等式可以變成? ? B` + 0001 = 10000 → 0000,? ?那么就可以知道 B` = 1111
也就是說考慮溢出整形的話,? 1111與-1的作用是一樣的

那么在允許溢出整形的情況下如何求得其他數(shù)字的相反數(shù)呢?
我們的重點是溢出整形, 并且溢出后需要整形為0000, 那么在溢出前最大的數(shù)字就是1111
然后我們的思路可以變?yōu)檫@樣,? 一個數(shù)字C, 它與B相加后為1111, 那么C+1就可以在形式上表示為-B? ?*** C+B=1111,? (C+1)+B=1000→0000
簡單可知C與B互為補數(shù),? 幸好在二進制里取補數(shù)最方便的方法就是取反, 即 C = not B
那么就可以得到負數(shù)的求得過程:? -B = (not B) +1
并且為了區(qū)分1111和1111, 一般有一個符號位在最左邊,? 也就是說在5bit整數(shù)里, -1 = 11111, 15=01111,??
但是一般不存在5bits這種奇葩的位數(shù),? 所以用8bits來做示例的話:
0 = 00000000;? ? -0 = 10000000
1 = 00000001;? ? -1 = 111111111
127 = 01111111;? ? -127?= 10000001
這就是一般說的8位符號整數(shù) 8int 的表示方法了, 最大數(shù)字: 127, 最小數(shù)字:-127

說了那么多廢話, 那么加減法器在mc怎么實現(xiàn)呢
我們已經(jīng)知道是否啟用減法要看符號位, 而我們習慣用S表示符號位, M表示數(shù)字本體
那么加減法器就可以表示為這種結構

而一塊關于減法的東西應該滿足下面的條件

經(jīng)過一番頭腦風暴后,? ?可以化簡得到? ?? Out =?此內(nèi)容已被隱藏, 需要回復以查看內(nèi)容
這個算式做成部件后就是這部分了

注意: 為了使得? 6 + (-4)? 這種計算成立,? 符號位S也應該參與到加法計算中,? ?例子:(8bits)
00000110 + 11111100 = 1 00000010 →?00000010
可以看出符號位非常自然地被進位頂走了, 經(jīng)過整形后得到的結果正是2
這種計算方法會讓超過位數(shù)限制的計算得出奇怪的結果, 例子:??120 + 56
01111000 + 00111000 = 10110000? ?得到的結果是176, 明顯超出了8int的范圍, 但是計算機是不知道這種事情的, 并且會把10110000繼續(xù)按照8int處理得到 -80
這種情況是真實存在的, 所以這里為了還原這種bug也不做專門的溢出處理了
有興趣的可以自己去嘗試做一下一部分的溢出處理

加減法器就到此結束了, 只要努力自己思考一下就可以慢慢拼湊出來的東西, 所以也不存在存檔這種東西了
其實封面就是一個"觸發(fā)型"的32bits加減法器= =
*****? ?Out = (M xor S) + S