原碼1位乘法
在定點計算機中,兩個原碼表示的數相乘的運算規則是:乘積的符號位由兩數的符號按異或運算得到。而乘積的數值部分則是兩個正數相乘之積。設n位被乘數和乘數用定點小數表示(定點整數也相同適用)
被乘數 [x]原 = xf .x0 x1 x2 … xn
乘數 [y]原 = yf .y0 y1 y2 … yn
則
乘積 [ z ]原 = ( xf⊕yf ) . (0. x0 x1 x2 …xn)(0 . y1 y2 …yn)
式中,xf為被乘數符號。yf為乘數符號。
乘積符號的運算法則是:同號相乘為正,異號相乘為負。因為被乘數和乘數和符號組合僅僅有四種情況(xf yf = 00,01,10,11),因此積的符號可按“異或”(按位加)運算得到。
數值部分的運算方法與普通的十進制小數乘法相類似。只是對於用二進制表達的數來說,其乘法規則更為簡單一些:從乘法y的最低位開始。若這一位為“1”。則將被乘數x寫下;若這一位為“0”,則寫下全0。然后再對乘數y的高一位進行的乘法運算,其規則同上,只是這一位乘數的權與最低位乘數的權不一樣。因此被乘數x要左移一位。依次類推。直到乘數各位乘完為止。最后將它們統統加起來。便得到最后乘積z 。
補碼1位乘法
原碼乘法的主要問題是符號位不能參加運算,單獨用一個異或門產生乘積的符號位。
故自然提出是否能讓符號數字化后也參加乘法運算,補碼乘法就能夠實現符號位直接參加運算。
設被乘數 [x]補 = x0.x1x2…xn 和乘數 [y]補 = y0.y1y2…yn 均為隨意符號,則有補碼乘法算式
[ x · y ]補 = [x]補 · ( - y0 + ∑ yi * 2^-i )
為了推出串行邏輯實現人分步算法,將上式展開加以變換:
[x·y]補 = [x]補·[ - y0 + y1^2-1 + y2^2-2 + … + yn^2-n]
= [x]補·[ - y0 + (y1 - y1^2-1) + (y2^2-1 - y2^2-2) + … + (yn^2-(n-1) - yn^2-n)]
= [x]補·[(y1 - y0) + (y2 - y1) ^2-1 + … + (yn - yn-1) 2^-(n-1) + (0 - yn)^2-n]
= [x]補· (yn+1 = 0)
補碼一位乘法運算規則
(1) 假設 yn = yn+1,部分積 [ zi ] 加0。再右移一位;
(2) 假設 yn yn+1 = 01。部分積加[ x ]補。再右移一位;
(3) 假設 yn yn+1 = 10,部分積加[ - x]補,再右移一位;
這樣反復進行 n+1 步,但最后一步不移位。包含一位符號位,所得乘積為 2n+1 位,當中 n 為尾數位數。