计算机采用补码表示数据,若用原码乘法计算两个数的乘积,还需要进行原码和补码间的转换,为减少处理环节,人们提出了补码乘法,又称为Booth算法。
以下内容以例题:
用补码一位乘法计算x * y
x = 0.10110 , y = - 0.00011 为例。
1.Booth算法
设 [ x ]补 = x0.x1…xn ,[ y ]补 = y0.y1…yn
1.被乘数x符号任意,乘数y符号为正:
[ x * y ]补 = [ x ]补 * y
2.被乘数x符号任意,乘数y符号为负:
[ x * y ]补 = Pn + 1 =Pn + (y1 - y0)[ x ]补
2.补码一位乘法算法
1.乘数y采用单符号位,末位添加附加位yn + 1,初始值为0。
2.部分积根据yn yn + 1来进行判断:
yn yn + 1 = 00或11时,P = P + 0;
yn yn + 1 = 10时,P = P + [ - x ]补;
yn yn + 1 = 01时,P = P + [ x ]补;
3.按上述算法进行n + 1次累加,n次右移操作即可完成乘积运算。
例子:
[ x ]补 = 0.10110, [ - x ]补 = 1.01010 ,[ y ]补 = 1.11101
| 部分积 | 乘数y (末尾添加附加位yn + 1初始为0) | 说明 |
|---|---|---|
| 00.00000 + 11.01010 |
1111010 | P0 = 0 yn yn + 1 = 10 ,+ [ - x ]补 |
| 11.01010 → 11.10101 + 00.10110 |
0111101 | 右移一位得 P1 yn yn + 1 = 01 ,+ [ x ]补 |
| 00.01011 → 00.00101 + 11.01010 |
1011110 | 右移一位得 P2 yn yn + 1 = 10 ,+ [ - x ]补 |
| 11.01111 → 11.10111 + 00.00000 |
1101111 | 右移一位得 P3 yn yn + 1 = 11 ,+0 |
| 11.10111 → 11.11011 + 00.00000 |
1110111 | 右移一位得 P4 yn yn + 1 = 11 ,+0 |
| 11.11011 → 11.11101 + 00,00000 |
1111011 | 右移一位得 P5 yn yn + 1 = 11 ,+0 |
| 11.11101 | 11110 | 最后一步不移位 |
所以 [ x * y ]补 = 1.1110111110
x * y = - 0.0001000010