0%

原码一位乘法

以下内容以例题:

用原码一位乘法计算x * y

x = - 0.11111 , y = 0.11101 为例。

1.运算方法

1.乘积符号的确定

被乘数 [ x ] = x0.x1…xn ,乘数[ y ] = y0.y1…yn ,x0和y0为乘数和被乘数的符号位,原码乘积的符号与两个符号位的关系为异或,即 Pf = x0 ⊕ y0 (“⊕”为异或符号,两数相同为0,不同为1) ,即被乘数与乘数同号,乘积为正,异号则为负。

例题 [ x ] = 1.11111 ,[ y ] = 0.11101 ,Pf = x0 ⊕ y0 = 1 ⊕ 0 = 1 ,乘积为负。

2.乘积的数值

乘积的运算为以下递归公式:

Pi + 1 = ( Pf + yn - i | x | )2-1

该公式采用递归计算乘积,设置累加寄存器存放部分积P,初始值P0 = 0,每得到一个位积(公式中的Pf + yn - i | x | )就累加到寄存器中,然后逻辑右移一位(公式中的2-1)得到新的P值

例:

部分积 乘数 | y | (部分积右移掉的数为1
就在乘数前面补1,为0补0)
说明
00.00000
+ 00.11111
11101 y5 = 1, + |x|
P0 = 0
00.11111
→ 00.01111
+ 00.00000
11101
11110
y4 = 0, + 0,
右移一位得P1
00.01111
→ 00.00111
+ 00.11111
11110
11111
y3 = 1, + |x|
右移一位得P2
01.00110
→ 00.10011
+ 00.11111
11111
01111
y2 = 1, + |x|
右移一位得P3
01.10010
→ 00.11001
+ 00.11111
01111
00111
y1 = 1, + |x|
右移一位得P4
01.11000
→ 00.11100
00111
00011
右移一位得P

符号位 Pf = x0 ⊕ y0 = 1

所以 [ x * y ] = 1.1110000011

x * y = - 0.1110000011

从上例可知:

两个n位数参加乘法运算要进行n次加法n次位移操作

加法运算可能会产生局部溢出,如上表中加粗的“ 1 ”,注意在进行逻辑右移操作时要将进位位移如部分积的最高位(不是补0)

例:

正常时00.01111进行逻辑右移后为00.00111,但01.10010右移后为00.11001