计算机中实现乘法运算有两种方式, 使用原码实现和使用补码实现.
使用原码并行乘法
使用原码事项乘法的方式, 类似于笔算乘法, 符号位使用异或电路实现.
运算过程: 加法 + 移位
有成熟的末位决定被乘数是否与原部分积相加, 部分积右移移位形成新的部分积. 部分积 就是被乘数乘以乘数积的其中一行.
定义公式:
[x]原=x0.x1 x2…xn[x]原=x0.x1 x2…xn∴[x⋅y]原=(x0⊕y0)+(x1x2…xn)⋅(y1y2…yn)
例1: $A = -0.1101 \quad B=0.1011 $
直接算: ⇒A×B=−0.10001111
根据公式计算:
[A]原=1.1101[B]原=0.1011
[x⋅y]原=(1⊕0)+(0.10001111)=[1.10001111]原=−0.10001111
移位操作
- 逻辑左移(LSL)和逻辑右移(LSR): bit位向左右移, 空出来的使用
0补全
- 算术左移(ASL)和算术右移(ASR): 算术左移同逻辑左移; 算术右移, bit位向右移, 空出来的使用符号位补全
第一类移动是将bit位简单移动, 不考虑计算因素, 第二类是在计算中的移位, 在补码运算中意义重大.
正、负数补码(算术)右移的意义
- 正数右移相当于对被操作数进行整除
- 负数右移也是对被操作数进行整除, 需要注意: 如果有余数, 结果-1; 负数整除最大值为-1;
定点小数真值和补码的另一关系
[X]补=X0.X1X2…Xn
[X]原=−X0+0.X1X2…Xn
例:
[1.11]补=−1+0.11=−1+0.11=[−0.01]真
[1.1]补=−1+0.1=[−0.1]真
补码乘法规则
设被乘数 [x]补=x0.x1x2…xn , 乘数 [y]补=y0.y1y2…yn
- 若被乘数任意, 乘数为正
- 同原码乘法规则, 但加法和移位操作按补码规则运算
- 乘积的符号自然形成
- 公式为: [x⋅y]补=[x]补(0.y1y2…yn)
--无需校正
- 拖被乘数任意, 乘数为负
- 乘数 [y]补 , 去掉符号位, 操作同上
- 运算完成后, 需对结果加 [−x]补 校正
- 公式为: [x⋅y]补=[x]补(0.y1y2…yn)+[−x]补
**统一补码乘法公式: ** [x⋅y]补=[x]补(0.y1y2…yn)+[−x]补⋅y0
Booth算法
运算规则
- 符号位参与运算, 运算数均以补码表示
- 被乘数一般去双符号位参与运算
- 乘数可取单符号位
- 乘数末位增设附加为Yn+1 , 切初值为0
- 操作按下表
- 最后一步无需移位
| Yn |
Yn+1 |
操作 |
| 0 |
0 |
部分积右移移位 |
| 0 |
1 |
部分积加 [x]补 , 右移一位 |
| 1 |
0 |
部分积加 [−x]补 , 右移一位 |
| 1 |
1 |
部分积右移一位 |
运算过程

Booth运算电路逻辑图

总结
计算集中乘法是通过加法实现的, 这里的加法不是简答的累加(例 4*5, 不是把4累加5次), 而是通过移位相加的方式, 通过计算机Booth算法进行乘法运算时最多相加次数为除数位数减1次.