(據說是重中之重的)補碼一位乘、二位乘

補碼一位乘:

例: 已知 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(用單符號表示)
在這裏插入圖片描述
所以結果是:[x
y]補=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(用雙符號表示)
在這裏插入圖片描述
所以最後結果爲:[x
y]補=1.10110010

這裏我們會一種計算方法就可以了,那就是booth算法吧。

此次分享就到這裏,歡迎大家指導指正~ 我是愛喫肉的小白yyyloki,如果你覺得不錯的話點個贊👍吧!或者你可以關注,持續更新計組。我們下次見~886

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章