原码一位乘法与补码一位乘法
原码1位乘法
在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号按异或运算得到。而乘积的数值部分则是两个正数相乘之积。设n位被乘数和乘数用定点小数表示(定点整数也相同适用)
被乘数 [x]原 = xf .x0 x1 x2 … xn
乘数 [y]原 = yf .y0 y1 y2 … yn
则
乘积 [ z ]原 = ( xf⊕yf ) . (0. x0 x1 x2 …xn)(0 . y1 y2 …yn)
式中,xf为被乘数符号。yf为乘数符号。
乘积符号的运算法则是:同号相乘为正,异号相乘为负。因为被乘数和乘数和符号组合仅仅有四种情况(xf yf = 00,01,10,11),因此积的符号可按“异或”(按位加)运算得到。
数值部分的运算方法与普通的十进制小数乘法相类似。只是对于用二进制表达的数来说,其乘法规则更为简单一些:从乘法y的最低位開始。若这一位为“1”。则将被乘数x写下;若这一位为“0”,则写下全0。然后再对乘数y的高一位进行的乘法运算,其规则同上,只是这一位乘数的权与最低位乘数的权不一样。因此被乘数x要左移一位。依次类推。直到乘数各位乘完为止。最后将它们统统加起来。便得到最后乘积z 。
补码1位乘法
原码乘法的主要问题是符号位不能參加运算,单独用一个异或门产生乘积的符号位。
故自然提出是否能让符号数字化后也參加乘法运算,补码乘法就能够实现符号位直接參加运算。
设被乘数 [x]补 = x0.x1x2…xn 和乘数 [y]补 = y0.y1y2…yn 均为随意符号,则有补码乘法算式
[ x · y ]补 = [x]补 · ( - y0 + ∑ yi * 2^-i )
为了推出串行逻辑实现人分步算法,将上式展开加以变换:
[x·y]补 = [x]补·[ - y0 + y1^2-1 + y2^2-2 + … + yn^2-n]
= [x]补·[ - y0 + (y1 - y1^2-1) + (y2^2-1 - y2^2-2) + … + (yn^2-(n-1) - yn^2-n)]
= [x]补·[(y1 - y0) + (y2 - y1) ^2-1 + … + (yn - yn-1) 2^-(n-1) + (0 - yn)^2-n]
= [x]补· (yn+1 = 0)
补码一位乘法运算规则
(1) 假设 yn = yn+1,部分积 [ zi ] 加0。再右移一位;
(2) 假设 yn yn+1 = 01。部分积加[ x ]补。再右移一位;
(3) 假设 yn yn+1 = 10,部分积加[ - x]补,再右移一位;
这样反复进行 n+1 步,但最后一步不移位。包含一位符号位,所得乘积为 2n+1 位,当中 n 为尾数位数。