0%

补码一位乘法

计算机采用补码表示数据,若用原码乘法计算两个数的乘积,还需要进行原码和补码间的转换,为减少处理环节,人们提出了补码乘法,又称为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