【计算机组成原理】定点乘法运算之原码两位乘法

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

  1. 原码两位乘法和原码一位乘法一样,符号位不参加运算
  2. 部分积和被乘数x均采用三位符号,乘数y末位每次要加一个c,c一开始是0
  3. 根据如下法则进行运算:
    · 000 -》 部分积加0,    右移两位,c变为0
    · 001 -》 部分积加|x|, 右移两位,c变为0
    · 010 -》 部分积加|x|, 右移两位,c变为0
    · 011 -》 部分积加2|x|,右移两位,c变为0
    · 100 -》 部分积加2|x|,右移两位,c变为0
    · 101 -》 部分积减|x|, 右移两位,c变为1
    · 110 -》 部分积减|x|, 右移两位,c变为1
    · 111 -》 部分积加0,     右移两位,c变为1
  4. 而乘数y用双符号还是单符号表示得根据乘数y的数值的奇偶性判断,而且最后一步移位与否也与乘数y的数值的奇偶性有关:
    · 如果乘数y的尾数n为偶数,则乘数y用双符号表示,最后一步不移位
    · 如果乘数y的尾数n为奇数,则乘数y用单符号表示,最后一步要移一位(也就是说把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|:
000.011010 + 000.1101 = 000.001110

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

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

这样的话,外加前面已知的符号位是负号,就可以得知最后结果[x * y]原 = 1.01001110

 

❤ 点击这里 -> 订阅《PAT | 蓝桥 | LeetCode学习路径 & 刷题经验》by 柳婼

❤ 点击这里 -> 订阅《从放弃C语言到使用C++刷算法的简明教程》by 柳婼

❤ 点击这里 -> 订阅PAT甲级乙级、蓝桥杯、GPLT天梯赛、LeetCode题解离线版