2.3 二进制乘法运算(定点原码两位乘)

2.3.2 定点原码两位乘

讨论x * y = z 采用原码两位乘法,已知x和y,如何求得z

原码两位乘法和原码一位乘法一样,符号位不参加运算
部分积和被乘数x均采用三位符号,乘数y末位每次要加一个c,c一开始是0
根据如下法则进行运算:

操作C值变化
000部分积加0,    右移两位0
001部分积加|x|, 右移两位0
010部分积加|x|, 右移两位0
011部分积加2|x|,右移两位0
100部分积加2|x|,右移两位0
101部分积减|x|, 右移两位1
110部分积减|x|, 右移两位1
111部分积加0,    右移两位1


而乘数y用双符号还是单符号表示得根据乘数y的数值的奇偶性判断,而且最后一步移位与否也与乘数y的数值的奇偶性有关:
· 如果乘数y的尾数n的位数为偶数,则乘数y用双符号表示,最后一步不移位
· 如果乘数y的尾数n的位数为奇数,则乘数y用单符号表示,最后一步要移一位
根据以上步骤我们就可以求得x * y的源码。

举个栗子~(栗子真的超好吃的啊啊啊啊呀~)

例如:x = -0.1101,y = 0.0110,求[x*y]原。

符号位是不参与运算哒,所以已经知道最后的结果是负啦~

先写出|x|和2|x|的值再说,用三位符号位表示哦~:
|x| = 000.1101, 2|x| = 001.1010

因为y的尾数n有4位是偶数,所以乘数y要用双符号表示,而且最后一步是不用移位的~
所以 |y| = 00.0110

一开始部分积为 000.0000,乘数为00.01100(先在末尾加个c,c一开始是0)

此时y = 00.01100的最后三位是100,根据运算法则,加2|x|:
000.0000 + 001.1010 = 001.1010

对部分积右移两位,得到:000.011010,而乘数c变成了0,y移动三位,c添加在末尾,所以此时的乘数变为了00.010,最后三位是010

根据运算法则,加|x|:部分积加0,     右移两位
000.011010 + 000.1101 = 001.001110

右移两位,得到:000.01001110,而乘数c变为了0,y移动三位,c添加在末尾,所以此时的乘数变为了00.0,因为最后三位是000

因为这已经是最后一步了,因为y是偶数所以最后一步不用移位~

这样的话,外加前面已知的符号位是负号,就可以得知最后结果[x * y]原 = -1.01001110
————————————————
以上来源于CSDN博主「柳婼」的原创文章(有修改)
原文链接:https://blog.csdn.net/liuchuo/article/details/52922479

这里我需要再加一个例子,还有遇到-x时情况:

例题:用原码两位乘计算X*Y 。x=1100,y=-0111

符号结果为负.

先写出 |x| = 00011002|x| = 0011000,这题里需要用到-x,计算机中-X*的操作可以由+[-X*]补 来替代,也就是+[-X]补 = 1110100.(原码转补码)

一开始部分积为0000000,y=0111,c=0,那么y结尾加c取到的应该为110,所以需要加[-X]补,部分积:

0000000+1110100=1110100右移两位:1111101,此时c变为1

y结尾加c取为011,需要加2|x|,部分积:

1111101+0011000=0010101,右移两位:0000101,此时c变为0;

此时已经y取完了(注意最后一次移位后,若c=1,需要补充一次+|x|的操作),加上符号位1⊕0=1,所以X*Y= -1010100

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值