計算機算術

二進位除法

除法就是你手算的直式長除法:每一步你問除數放不放得進被除數目前這一段,寫下一個商位數,放得進就相減,再把下一個位數拉下來。二進位讓「放得進幾次」這個問題變得極簡——答案永遠只有 0 或 1——但它沒讓除法變快,因為每一步的「放不放得進」決定都依賴前一步的相減,所以工作頑固地串列。

復原式演算法逐字照著長除法走:把餘數左移、減去除數、看符號。若結果非負,除數放得進,商位元是 1,你保留這次相減。若變負,除數放不進,商位元是 0,你必須復原——把除數加回去以撤銷這次試減。那次復原的加法是白做的工。非復原式演算法是常見的改良:它不撤銷失敗的相減;而是記住它變負了,並在下一步改成加除數而非減。這移除了復原步驟,給出每個商位元固定一次加或減,代價是最末端要做一個小修正。

這就是為什麼除法是慢的算術運算。加與減在不到一個週期內完成;建得好的乘法器幾個週期內完成;但一個直接的除法器約需每個結果位元一次反覆——一次 64 位元除法要數十個週期——因為每個商位元都依賴前一個餘數。更快的除法器是有的(SRT 除法用查表每步定下好幾個位元;Newton-Raphson 與 Goldschmidt 法用乘法算出倒數,幾步乘法就收斂),但它們繁複,所以設計者常接受「除法很少見」這件事,讓它慢,而不花大面積把它弄快。

把 0b1011(11)除以 0b0011(3),逐位元做:對領頭的餘數位元試減除數;若結果非負則商位元為 1,否則為 0(復原式會把 3 加回)。過程得到商 0b0011(3)與餘數 0b0010(2),因為 3 x 3 + 2 = 11。

每個商位元一次試減;每個位元都得等前一個餘數,所以很慢。

除法確實是最慢的基本運算,因為它本質上是串列的——每個商位元都依賴前一個餘數。編譯器常把「除以常數」換成乘法加移位,以完全避開除法器。

又称
restoring/non-restoring division二進位除法演算法