计算机中实现乘法运算有两种方式, 使用原码实现和使用补码实现.

使用原码并行乘法

使用原码事项乘法的方式, 类似于笔算乘法, 符号位使用异或电路实现.

运算过程: 加法 + 移位

有成熟的末位决定被乘数是否与原部分积相加, 部分积右移移位形成新的部分积. 部分积 就是被乘数乘以乘数积的其中一行.

定义公式:
[x]=x0.x1 x2xn[x]=x0.x1 x2xn[xy]=(x0y0)+(x1x2xn)(y1y2yn) [x]_原 = x_0.x_1\ x_2\dots x_n \\ [x]_原 = x_0.x_1\ x_2\dots x_n \\ \therefore [x\cdot y]_原 = (x_0 \oplus y_0)+(x_1 x_2\dots x_n)\cdot (y_1 y_2\dots y_n)

例1: $A = -0.1101 \quad B=0.1011 $

直接算: A×B=0.10001111\Rightarrow A \times B=-0.10001111

根据公式计算:

[A]=1.1101[B]=0.1011[A]_原 = 1.1101 \quad [B]_原=0.1011

[xy]=(10)+(0.10001111)=[1.10001111]=0.10001111[x \cdot y]_原 = (1 \oplus 0)+ (0.10001111)= [1.10001111]_原 = -0.10001111


移位操作

  • 逻辑左移(LSL)和逻辑右移(LSR): bit位向左右移, 空出来的使用0补全
  • 算术左移(ASL)和算术右移(ASR): 算术左移同逻辑左移; 算术右移, bit位向右移, 空出来的使用符号位补全

第一类移动是将bit位简单移动, 不考虑计算因素, 第二类是在计算中的移位, 在补码运算中意义重大.

正、负数补码(算术)右移的意义

  • 正数右移相当于对被操作数进行整除
  • 负数右移也是对被操作数进行整除, 需要注意: 如果有余数, 结果-1; 负数整除最大值为-1;

定点小数真值和补码的另一关系

[X]=X0.X1X2Xn[X]_补 = X_0.X_1X_2\dots X_n

[X]=X0+0.X1X2Xn[X]_原 = -X_0 + 0.X_1X_2\dots X_n

例:

[1.11]=1+0.11=1+0.11=[0.01][1.11]_补 = -1 + 0.11 = -1 + 0.11 = [-0.01]_真

[1.1]=1+0.1=[0.1][1.1]_补 = -1 + 0.1 = [-0.1]_真


补码乘法规则

设被乘数 [x]=x0.x1x2xn[x]_补 = x_0.x_1 x_2 \dots x_n , 乘数 [y]=y0.y1y2yn[y]_补= y_0.y_1 y_2 \dots y_n

  • 若被乘数任意, 乘数为正
    • 同原码乘法规则, 但加法移位操作按补码规则运算
    • 乘积的符号自然形成
    • 公式为: [xy]=[x](0.y1y2yn)[x \cdot y]_补 = [x]_补 (0.y_1 y_2 \dots y_n) --无需校正
  • 拖被乘数任意, 乘数为负
    • 乘数 [y][y]_补 , 去掉符号位, 操作同上
    • 运算完成后, 需对结果加 [x][-x]_补 校正
    • 公式为: [xy]=[x](0.y1y2yn)+[x][x \cdot y]_补 = [x]_补 (0.y_1 y_2 \dots y_n) + [-x]_补

**统一补码乘法公式: ** [xy]=[x](0.y1y2yn)+[x]y0[x\cdot y]_补 = [x]_补 (0.y_1 y_2 \dots y_n) + [-x]_补\cdot y_0


Booth算法

运算规则

  • 符号位参与运算, 运算数均以补码表示
  • 被乘数一般去双符号位参与运算
  • 乘数可取单符号位
  • 乘数末位增设附加为Yn+1Y_{n+1} , 切初值为0
  • 操作按下表
  • 最后一步无需移位
YnY_n Yn+1Y_{n+1} 操作
0 0 部分积右移移位
0 1 部分积加 [x][x]_补 , 右移一位
1 0 部分积加 [x][-x]_补 , 右移一位
1 1 部分积右移一位

运算过程
【计算机组成原理】乘法运算总结

Booth运算电路逻辑图
【计算机组成原理】乘法运算总结

总结

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

相关文章: