[toc]
移位分为算术移位,逻辑移位和循环移位三类,它们又可以分为左移和右移
1. 算术移位规则
原码的移位规则:负数的原码移位后的空出位补0
补码的移位规则:
- 负数的补码左移后的空出位补0
- 负数的补码右移后的空出位补1
移位功能的实现:通过移位操作由移位寄存器来实现,也有在加法器的输出的加一个实现直传、左移一位和右移一位的控制逻辑电路(称为移位器)
2. 定点乘法运算
2.1 原码一位乘法
- 参加运算的操作数取其绝对值
令乘数的最低位为判断位
- 若为1,加被乘数
- 若为0,不加被乘数
累加后的部分积右移一位(这里是逻辑移位)
- 重复n次2,3步
- 符号位单独处理,同号为正,异号为负
例题:
2. 2 补码一位乘法
2.2.1 校正法
- 被乘数任意,乘数为正:同原码乘,但加和移位按补码规则运算,乘积的符号自然形成
- 被乘数任意,乘数为负:乘数$[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,下一位为0,则用部分积减去乘数,得到新的部分积
- 若乘数当前位为0,下一位为1,则用部分积加上乘数,得到新的部分积
- 若乘数当前位与下一位相同,则什么都不做
- 上诉操作后按照补码规则右移
注意事项:
- 当被乘数与部分积相加时,产生的进位将被丢弃
- 部分积移位时,使用算数移位,最高位补符号位
- 乘法开始时,乘数的当前位(n)为其最低位,下一位(n+1)为0
3. 定点数的除法运算
3.1 原码恢复余数法
步骤:
- 将除数的最高位与被除数的最高位对齐
从部分被除数中减去除数,得到新的部分被除数
- 若新的部分被除数为负,则商左移一位,最低位补0,并用新的部分被除数加上除数,恢复原先的部分被除数
- 若新的部分被除数为正,则商左移一位,最低位补1
判断除法是否结束。若除数的最低位与部分被除数的最低位对齐,则除法结束。最后的部分被除数就是余数
- 将除数右移1位,从第②步继续执行
原码恢复余数法在计算机中一般很少采用
3.2 原码不恢复余数除法(加减交替法)
和原码恢复余数除法的区别是:
- 若新的部分被除数为正,商左移一位,最低位补1,部分被除数减去除数
- 先对除数进行右移再判断新的部分被除数为正为负
例题: