定点数的乘、除法运算


[toc]

移位分为算术移位,逻辑移位和循环移位三类,它们又可以分为左移和右移

1. 算术移位规则

原码的移位规则:负数的原码移位后的空出位补0

补码的移位规则:

  1. 负数的补码左移后的空出位补0
  2. 负数的补码右移后的空出位补1

移位功能的实现:通过移位操作由移位寄存器来实现,也有在加法器的输出的加一个实现直传、左移一位和右移一位的控制逻辑电路(称为移位器)

2. 定点乘法运算

2.1 原码一位乘法

  1. 参加运算的操作数取其绝对值
  2. 乘数最低位为判断位

    1. 若为1,加被乘数
    2. 若为0,不加被乘数
  3. 累加后的部分积右移一位(这里是逻辑移位

  4. 重复n次2,3步
  5. 符号位单独处理,同号为正,异号为负

例题:

image-20210410143014142

2. 2 补码一位乘法

2.2.1 校正法

  1. 被乘数任意,乘数为正:同原码乘,但加和移位按补码规则运算,乘积的符号自然形成
  2. 被乘数任意,乘数为负:乘数$[Y]_{补}$,去掉符号位,操作同①,最后加$[-X]_{补}$,校正

2.2.2 Booth算法

以小数为例子:

设$[X]_补 = X_s.X_1X_2…X_n\quad[Y]_补=Y_S.Y_1Y_2…Y_n$

$[X*Y]_补 $

$ = [X]_补(0.Y_1Y_2…Y_n) - [X]_补 * Y_s$

$=[X]_补(Y_12^{-1}+Y_22^{-2}+…+Y_n2^{-n}) - [X]_补*Y_s$

$=[X]_补\ (-Y_s + Y_12^{-1} + Y_22^{-2} + … + Y_n2^{-n})$

$=[X]_补=[-Y_s + (Y_1 - Y_12^{-1}) + (Y_22^{-1} - Y_22^{-2}) + … + (Y_n2^{-(n-1)}-Y_n2^{-n})]$

$=[X]_补 = [(Y_1-Y_s) + (Y_2 - Y_1)2^{-1} + … + (Y_n - Y_{n-1}2^{-(n-1)}) + (0 - Y_n)2^{-n}]$

递推公式

其中,$[Z_0]_补$为初始部分积,$[Z_1]_补\sim[Z_n]_补$依次为各次求得的累加并右移之后的部分积

描述:对于乘数$[Y]_补 = Y_1Y_2…Y_n$,被乘数$[X]_补=X_1X_2….X_n$,即乘数、被乘数都用补码表示,得到的结果也是补码的形式

  1. 若乘数当前位为1,下一位为0,则用部分积减去乘数,得到新的部分积
  2. 若乘数当前位为0,下一位为1,则用部分积加上乘数,得到新的部分积
  3. 若乘数当前位与下一位相同,则什么都不做
  4. 上诉操作后按照补码规则右移

注意事项:

  1. 当被乘数与部分积相加时,产生的进位将被丢弃
  2. 部分积移位时,使用算数移位,最高位补符号位
  3. 乘法开始时,乘数的当前位(n)为其最低位,下一位(n+1)为0

3. 定点数的除法运算

3.1 原码恢复余数法

步骤:

  1. 将除数的最高位与被除数的最高位对齐
  2. 从部分被除数中减去除数,得到新的部分被除数

    1. 若新的部分被除数为负,则商左移一位,最低位补0,并用新的部分被除数加上除数,恢复原先的部分被除数
    2. 若新的部分被除数为正,则商左移一位,最低位补1
  3. 判断除法是否结束。若除数的最低位与部分被除数的最低位对齐,则除法结束。最后的部分被除数就是余数

  4. 将除数右移1位,从第②步继续执行

原码恢复余数法在计算机中一般很少采用

3.2 原码不恢复余数除法(加减交替法)

和原码恢复余数除法的区别是:

  1. 若新的部分被除数为正,商左移一位,最低位补1,部分被除数减去除数
  2. 先对除数进行右移再判断新的部分被除数为正为负

例题:

image-20210410154122807