如何在mc里打造一個計算器[5] -- 除法器

如果還沒看過乘法器的, 推薦去看一下乘法器以便回想一下小學(xué)學(xué)了什么


回想起小學(xué)算特別長的除法時, 會把除數(shù)乘1~9的結(jié)果寫在一盤, 再逐條與當前算到的數(shù)字比較, 然后.....嘛, 大家記得除法怎么算就行了
簡單看一下, 可以看到除法其實就是在重復(fù) "比較, 減法, 取出被除數(shù)下一位" 這個操作, 那么就像其他部件一樣可以做一個實現(xiàn)單一操作的部件, 拼在一起就是得到除法器了
我們先來看看每一步操作的輸入和輸出需要什么
首先輸出必定要有商的其中一位, 由于二進制只有0和1, 所以商的其中一位就是1bit, 其次就是輸出做完減法后剩下的數(shù)字, 這串數(shù)字將會輸入進下一個部件, 那么部件的輸入就有上一個部件做完減法的數(shù)字, 并且還需要從被除數(shù)里拿出下一位, 由于二進制只有01, 那么需要比較的數(shù)字也只有 0*除數(shù),1*除數(shù), 那么輸入也應(yīng)當含有除數(shù)*.

弄清楚每一個步驟的輸入輸出后, 接下來看看里面數(shù)據(jù)如何流動
以下稱從上一個部件輸出的數(shù)字為A, 而從被除數(shù)拿出來的叫a, 除數(shù)*為B, 商輸出的一位為c, 減法后的余數(shù)為C
首先A左移一位為a騰出位置, 得到的新數(shù)字 A_ = A<<1 + a,? ?然后跟著A_與除數(shù)比較, 如果A_比除數(shù)大, 則商輸出c=1, 余數(shù)C = A_ - 除數(shù)*, 其中A_-除數(shù)可以寫為A_+(-除數(shù)),?
*由于除數(shù)總是與減法一起計算, 所以在除法開始前需要預(yù)先計算(0-除數(shù)), 得到的數(shù)字再作為后續(xù)操作的輸入
如果不熟悉正數(shù)與負數(shù)的轉(zhuǎn)換, 可以去參考之前的加減法器

由加法器的原理簡單可知 (溢出整形, 還記得嗎),? (A_永遠小于2*除數(shù), 這部分自己思考一下吧)當計算A_+(-除數(shù))的時候, 如果A_>=除數(shù)時,?溢出位為1, 否則為0,? 而這個就可以作為我們判斷的標準
稍微整理一下思路就得到了實現(xiàn)除法里一步的部件

就像小學(xué)除法一樣, 拿被除數(shù)也是從高位開始拿, 輸出商也是從高位開始輸出, 當被除數(shù)(int)用完后, 剩下的C輸出就是除法的余數(shù)

就如同大部分部件一樣, 除法器可以把重復(fù)出現(xiàn)的部分"折疊"起來, 使得體積更小, 但運行速度減慢

一般計算器里的部件原理都不太復(fù)雜, 靜下心來稍微想想就會懂的了
但是下一篇的BIN轉(zhuǎn)BCD就可能不是了