補碼一位乘:
例: 已知 x=0.1011,y= - 0.0001(真值)
[x]補=01011 , [y]補= 11111 [x *y]補=111110101
[x]補 * [y]補=101010101
顯然,[x * y]補 ≠ [x]補 * [y]補
▲ 對兩個正數來說,它們補碼的乘積等於它們乘積的補碼。若乘數是負數時,這種情況就不成立了。
- 校正法
校正法的運算法則跟原碼一樣,只需對乘法判斷正負來確定是否需要校正就ok了。
有關校正法的兩個定理 |
---|
①對於補碼一位乘,當乘數y爲正數時,不管被乘數x的符號如何,都按照原碼乘法的運算規則來計算,但是移位應該按照補碼的算術移位來操作。 |
②對於補碼一位乘,當乘數y爲負數時,不管被乘數x的符號如何,都按照原碼乘法的運算規則來計算,但是移位應該按照補碼的算術移位來操作,並且需要在最後的結果上加上[-x]補進行校正。 |
例:假設[x]補=0.1101,[y]補=1.0101,用校正法來計算[x*y]補?
解:首先算出[-x]補=1.0011,取[y]補爲乘數,乘數符號位不參與運算。
部分積符號位一定要兩位,避免出現溢出現象導致出錯。
最後結果是1.01110001。(表中的符號位是兩位,從之前的學習知道,符號位取最高位)。
從校正法的原理來看,如果x是一個正數,y是一個負數,那麼應該使用一個技巧,將x與y調換,反正x的符號是什麼都沒有關係。如果y是正數那麼就省去了最後一步加[-x]補的校正。如果x與y都是負數,則必須校正。
- 比較法(booth算法)(重點)
運算規則:
booth算法運算規則 |
---|
① 符號位參與運算,運算的數均以補碼錶示。 |
②被乘數一般取雙符號位,參加運算,部分積初值爲0 |
③乘數取單符號位以決定最後一步是否需要校正,即是否加[-x]補 |
④乘數末尾增設附加位yn+1,初始值爲0 |
yn、yn+1狀態運算規則:假設yn+1 - yn=a,對應的操作就是部分積先加上a * [x]補,再右移一位(減[x]補,就是加上[-x]補)
ynyn+1 | yn+1 - yn | 操作 |
---|---|---|
00 | 0 | 部分積右移一位 |
01 | 1 | 部分積加[x]補,再右移一位 |
10 | -1 | 部分積加[-x]補,再右移一位 |
11 | 0 | 部分積右移一位 |
例:x=-0.1101,y=0.1011,用補碼一位乘求[xy]補?
[x]補=1.0011,[-x]補=00.1101(用雙符號表示),[y]補=0.1011(用單符號表示)
所以結果是:[xy]補=1.01110001。
補碼二位乘:
運算法則 |
---|
①符號位參加運算,兩數均用補碼錶示 |
②部分積與被乘數均採用3位符號,乘數末位增加一位yn+1,其初值爲0 |
yn-1ynyn+1 | 操作 |
---|---|
000 | 加0,右移兩位 |
001 | 加[x]補,右移兩位 |
010 | 加[x]補,右移兩位 |
011 | 加2[x]補,右移兩位 |
100 | 加2[-x]補,右移兩位 |
101 | 加[x]補,右移兩位 |
110 | 加[-x]補,右移兩位 |
111 | 加0,右移兩位 |
④若尾數字長n爲偶數,(不含符號),乘數用雙符號,最後一步不移位;
若尾數字長n爲奇數(不含符號),乘數用單符號,最後一步移一位。
例:x=-0.1101,y=0.0110,用補碼兩位乘[xy]補?
[y]補=00.0110(用雙符號表示)
所以最後結果爲:[xy]補=1.10110010
這裏我們會一種計算方法就可以了,那就是booth算法吧。