首先,符號位和數值位要分開計算,因此分為兩步:
(1)確定乘積的符號位。由兩個乘數的符號異或得到。
(2)計算乘積的數值位。
已知[x]原= x0.x1x2……xn,[y]原= y0.y1y2……yn
通過數學推導得:
x × y = x × (0.y1y2…yn)
=x × y1 × 2-1+x × y2 × 2-2 + … +x × yn× 2-n
=2-1(2-1(2-1…(2-1(2-1(0 + x × yn)+ x × yn-1)+ … + x × y2) + x × y1
得到遞推公式:pi+1= 2-1(pi + x × yn-i) (i = 0, 1, 2…, n-1)
最終乘積:pn = x × y
迭代過程如下:
取乘數的最低位yn-i判斷。
若yn-i的值為1,則將上一步迭代部分積pi與x相加;反之為0,則什麼也不做。
右移一位,產生本次部分積pi+1
部分積pi和x進行無符號數相加,可能會產生進製,所以需要乙個專門的進製位c。整個迭代過程從乘數最低位yn和p0 = 0開始,經過n次「判斷-加法-右移」迴圈,直到求出pn為止。若每次迴圈在乙個時鐘週期內完成,則n位乘法需要n個時鐘週期來完成。
例:[x]原 = 0.1101, [y]原 = 0.1011
符號位為0⊕0=0,所以結果為:0.1000 1111
對於n位原碼一位乘法來說,需要經過n次「判斷-加法-右移」迴圈,運算速度慢,如果對乘數的每兩位取值情況進行判斷, 使每步求出對應於該兩位的部分積,則可將乘法速度提高一倍。
每兩位的組合及對應的求部分積的操作情況如下:
若yi-1yi = 00, 則pi+1 = 2-2(pi + 0)對於上述「+0」, 「+x",與前面原碼一位乘法一樣即可;對於「+2x」,可以通過左移一位實現;對於「+3x」,用4x - x代替,本次執行「-x」(「-x」由其補碼實現)下一次執行「+4x」。 這種情況下, 部分積可以由pi+1 = 2-2( pi + 3x) = 2-2( pi -x + 4x) = 2-2( pi - x) + x 得到。所以「+4x」變成「+x」,可以由乙個觸發器t記錄下次是否需要進行「+x」。若yi-1yi = 01, 則pi+1 = 2-2(pi + x)
若yi-1yi = 10, 則pi+1 = 2-2(pi + 2x)
若yi-1yi = 11, 則pi+1 = 2-2(pi + 3x)
例:[x]原 = 0.111001, [y]原 = 0.100111
加上符號位,得到結果為:0.100010101111
其中採用了模8補碼形式,因為若要用模4補碼,則y和p同時右移兩位時,得到的p3是負數,這是錯誤的,所以要再增加乙個符號位。
原碼一位乘法
1.手算乘法 鋪墊 例子 13 11 143 被乘數不動,從乘數最低位開始,每一位乘上被乘數,將所得的結果 部分積 記下,再從比最低位高一位的數字開始如上迴圈,直至乘數的最高位也計算完畢。最終將每一豎列的數值相加即可得出結果。按照我們小學所學的乘法計算公式應該如上圖所示沒有問題,我們教科書裡說的原碼...
運算(原碼 補碼 反碼)
表示不帶符號向右移動二進位制數,移動後前面統統補0 兩個箭頭表示帶符號移動,沒有 這種運算子,因為左移都是補零,沒有正負數的區別。如 12 的二進位制為 1111 1111 1111 1111 1111 1111 1111 0100 12 3 即帶符號右移3位,結果是 1111 1111 1111 ...
大數乘法運算
第8章課後第18題要求 程式設計計算並輸出1 40之間所有數的階乘 40的階乘遠遠超過了長整型所能表示的範圍,因此該題目涉及到大整數的儲存和大整數乘法運算問題 也稱作高精度運算 大整數儲存的解決方案就是把大整數儲存到乙個陣列中,每個陣列元素儲存該數的一位 也可以是多位數字 在階乘這個問題中,階乘的值...