(据说是重中之重的)补码一位乘、二位乘

补码一位乘:

例: 已知 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

在这里插入图片描述

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