1.原码一位乘
首先注意,在乘法运算中,同号为正,异号为负。在这里我们用异或符号表达符号位:
被乘数 [x]原 = xf .x0 x1 x2 … xn
乘数 [y]原 = yf .y0 y1 y2 … yn
两者乘积 [ z ]原 = ( xf⊕yf ) . (0. x0 x1 x2 …xn)(0 . y1 y2 …yn)
原码一位乘和我们认识中的乘法运算一样,只不过在计算机内部采用移位的方法。例如, x = 0.1101, y = 0.1011,演示过程:
| 部分积 |
|
| 乘数 | 说明 | ||||||||||
|
|
| 00.0000 |
| yf | 1 | 0 | 1 | 1 |
| z0 = 0 | ||||
| + |
| 00.1101 |
|
|
|
|
|
|
| y4 = 1,+ x | ||||
|
|
| 00.1101 |
|
|
|
|
|
|
|
| ||||
|
| → | 00.0110 |
| 1 | yf | 1 | 0 | 1 |
| 右移,得z1 | ||||
| + |
| 00.1101 |
|
|
|
|
|
|
| Y3 = 1,+ x | ||||
|
|
| 01.0011 |
|
|
|
|
|
|
|
| ||||
|
| → | 00.1001 |
| 1 | 1 | yf | 1 | 0 |
| 右移,得z2 | ||||
| + |
| 00.0000 |
|
|
|
|
|
|
| Y2 = 0,+0 | ||||
|
|
| 00.1001 |
|
|
|
|
|
|
|
| ||||
|
| → | 00.0100 |
| 1 | 1 | 1 | yf | 1 |
| 右移,得z3 | ||||
| + |
| 00.1101 |
|
|
|
|
|
|
| Y1 = 1,+ x | ||||
|
|
| 01.0001 |
|
|
|
|
|
|
|
| ||||
|
| → | 00.1000 |
| 1 | 1 | 1 | 1 | yf |
| 右移,得z3 = xy |
所以 x · y = 0.10001111
2.补码一位乘
实现这种补码乘法规则时,在乘数最末位后面要增加一位补充位 yn+1 (0)。开始时,由 ynyn+1 判断第一步该怎么操作;然后再由 yn - 1 yn 判断第二步该怎么操作。因为每做一步要右移一位,故做完第一步后, yn - 1 yn 正好移到原来 ynyn+1 的位置上。依此类推,每步都要用 ynyn+ 1 位置进行判断,我们将这两位称为判断位。
判断位遵从以下乘法运算规则:(1) 如果 yn = yn+1,部分积 [ zi ] 加0,再右移一位;
(2) 如果 yn yn+1 = 01,部分积加[ x ]补,再右移一位;
(3) 如果 yn yn+1 = 10,部分积加[ -x ]补,再右移一位;
这样重复进行 n+1 步,但最后一步不移位,包括一位符号位。
由运算规则可知,我们要求出
被乘数x的[ x ]补,[ -x ]补,根据乘数yn和yn+1
例如, x = 0.1101, y = 0.1011,演示过程:
[-x]补=1.0011 , [y]补=0.1011
|
| 部分积 |
|
| 乘数 | 说明 | ||||||||||
|
|
| 00.0000 |
| 0. | 1 | 0 | 1 | 1 | 0 | yn+1 = 0 | |||||
| + |
| 11.0011 |
|
|
|
|
|
|
| ynyn+1 = 10,加[-x]补 | |||||
|
|
| 11.0011 |
|
|
|
|
|
|
|
| |||||
|
| → | 11.1001 |
| 1 | 0 | 1 | 0 | 1 | 1 | 右移一位 | |||||
| + |
| 00.0000 |
|
|
|
|
|
|
| ynyn+1 = 10,加0 | |||||
|
|
| 11.1001 |
|
|
|
|
|
|
|
| |||||
|
| → | 11.1100 |
| 1 | 1 | 0 | 1 | 0 | 1 | 右移一位 | |||||
| + |
| 00.1101 |
|
|
|
|
|
|
| ynyn+1 = 01,加[x]补 | |||||
|
|
| 00.1001 |
|
|
|
|
|
|
|
| |||||
|
| → | 00.0100 |
| 1 | 1 | 1 | 0f | 1 | 0 | 右移一位 | |||||
| + |
| 11.0011 |
|
|
|
|
|
|
| ynyn+1 = 01,加[-x]补 | |||||
|
|
| 11.0111 |
|
|
|
|
|
|
|
| |||||
|
| → | 11.1011 |
| 1 | 1 | 1 | 1 | 0 | 1 | 右移一位 | |||||
| + |
| 00.1101 |
|
|
|
|
|
|
| ynyn+1 = 01,加[x]补 | |||||
|
|
| 00.1000 |
| 1 | 1 | 1 | 1 | 0 | 1 | 最后一步不移位 |
所以 [x · y]补 = 0.10001111