原码乘法、补码乘法

转自:http://www1.hrbust.edu.cn/zuzhijigou/metc/material/zcyl/Chap02/2.3.2.htm

1 .原码乘法         

1.人工算法与机器算法的同异性

  在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号位按异或

运算得到,而乘积的数值部分则是两个正数相乘之积。

  设n位被乘数和乘数用定点小数表示(定点整数也同样适用)

       被乘数   []f .xn-1…x10

        乘数   []f .yn-1…y10

乘积
[]=(ff)+(0.n-1…x10)(0.n-1…y10)
(2.26)
式中,f为被乘数符号,f为乘数符号。

  乘积符号的运算法则是:同号相乘为正,异号相乘为负。由于被乘数和乘数和符号组合只有

四种情况(ff=00,01,10,11),因此积的符号可按“异或”(按位加)运算得到。

  数值部分的运算方法与普通的十进制小数乘法类似,不过对于用二进制表达式的数来说,其乘

法规则更为简单一些。

  设=0.1101,=0.1011.让我们先用习惯方法求其乘积,其过程如下:

  运算的过程与十进制乘法相似:从乘数的最低位开始,若这一位为“1”,则将被乘数

下;若这一位为“0”,则写下全0。然后在对乘数y的最高为进行乘法运算,其规则同上,不过这

一位乘数的权与最低位乘数的权不一样,因此被乘数要左移一位。以此类推,直到乘数个位乘完

为止,最后将它们统统加起来,变得到最后乘积

  如果被乘数和乘数用定点整数表示,我们也会得到同样的结果。

  人们习惯的算法对机器并不完全适用。原因之

一,机器通常只有n位长,两个n位数相乘,乘积可能为

2n位。原因之二,只有两个操作数相加的加法器难以

胜任将n各位积一次相加起来的运算。早期计算机中

为了简化硬件结构,采用串行的1位乘法方案,即多次

执行“加法—移位”操作来实现。这种方法并不需

要很多器件。然而串行方法毕竟太慢,自从大规模集

成电路问世以来,出现了各种形式的流水式阵列乘

法器,它们属于并行乘法器。

图2.4 m×n位不带符号的阵列乘法器       逻辑图

 

2.不带符号的阵列乘法器

设有两个不带符号的二进制整数:

Aam-1a1a0

Bbn-1b1b0

它们的数值分别为ab,即

m-1     n-1 
a =∑ai2i  b =∑bj2j
i=0      j=0

在二进制乘法中,被乘数A与乘数B相乘,产生mn位乘积P

Ppm+n-1…p1p0

乘积P 的数值为

       

实现这个乘法过程所需要的操作和人们的习惯方法非常类似:

  上述过程说明了在m位乘n位不带符号整数的阵列乘法中,“加法—移位”操作的被加数矩

阵。每一个部分乘积项(位积)aibj叫做一个被加数。

m×n个被加数{aibj|0im-1和0jn-1}

可以用m×n个“与”门并行地产生。显然,设计高速并行乘法器的基本问题,就在于缩短被加数

矩阵中每列所包含的1的加法时间。

5位×5位阵列乘法器的逻辑电路图演示 

  这种乘法器要实现n×n位时,需要n(n-1)个全加器和n2个“与”门。该乘法器的总的乘法

时间可以估算如下:

  令Ta为“与门”的传输延迟时间,Tf为全加器(FA)的进位传输延迟时间,假定用2级“与非”逻辑来实现FA的进位链功能,那么我们就有:

Ta = Tf = 2T

 从演示中可知,最坏情况下延迟途径,即是沿着矩阵最右边的对角线和最下面的一行。因而得

n×n位不带符号的阵列乘法器总的乘法时间为:

    tmTa+[(n-1)+(n-1)]×Tf=2T+(2n-2)×2T=(4n-2)×2T     (2.27)                      

[例16] 参见上CAI演示,已知两个不带符号的二进制整数A = 11011,B = 10101,求每一部分乘

积项aibj的值与p9p8……p0的值。

[解:]

a4b0=1 a3b0=1 a2b0=0 a1b0=1 a0b0=1

a4b1=0 a3b1=0 a2b1=0 a1b1=0 a0b1=0

a4b2=1 a3b2=1 a2b2=0 a1b2=1 a0b2=0

a4b3=0 a3b3=0 a2b3=0 a1b3=0 a0b3=0

a4b4=1 a3b4=1 a2b4=0 a1b4=1 a0b4=1

Pp9p8p7p6p5p4p3p2p1p0=1000110111 (56710)

3.带符号的阵列乘法器

(1) 对2求补器电路

  我们先来看看算术运算部件设计中经常用到的求补电路。一个具有使能控制的二进制对2求补

器电路图演示,其逻辑表达式如下:

C-1=0,  CiaiCi-1

ai*=aiECi-1,   0in

 在对2求补时,要采用按位扫描技术来执行所需要的求补操作。令Aana1a0是给定的(n+1)为

带符号的数,要求确定它的补码形式。进行求补的方法就是从数的最右端a0开始,,由右向左,直到

找出第一个“1”,例如ai=1, 0in。这样,ai以左的每一个输入位都求反,即1变0,0变1。最右

端的起始链式输入C-1必须永远置成“0”。当控制信号线E为“1”时,启动对2求补的操作。当控

制信号线E为“0”时,输出将和输入相等。显然,我们可以利用符号位来作为控制信号。

  例如,在一个4位的对2求补器中,,如果输入数为1010,那么输出数应是0110,其中从右算起的

第2位,就是所遇到的第一个“1”的位置。用这种对2求补器来转换一个(n+1)为带符号的数,所需

的总时间延迟为

             tTCn·2T+5T=(2n+5)T           (2.28)

 其中每个扫描级需2T延迟,而5T则是由于“与”门和“异或”门引起的。

(2) 带符号的阵列乘法器

  (n+1)×(n+1)位带求补器的阵列乘法器逻辑方框图演示 

   通常,把包括这些求补级的乘法器又称为符号求补的阵列乘法器。在这种逻辑结构中,共使

用三个求补器。其中两个算前求补器的作用是:将两个操作数AB在被不带符号的乘法阵列(核心

部件)相乘以前,先变成正整数。而算后求补器的作用则是:当两个输入操作数的符号不一致时,把

运算结果变成带符号的数。

  设A=anan-1a1a0B=bnbn-1b1b0均为用定点表示的(n+1)位带符号整数。在必要的求补

操作以后,AB的码值输送给n×n位不带符号的阵列乘法器,并由此产生2n位真值乘积:

               A·BPp2n-1p1p0

                 p2nanbn

  其中P2n为符号位。

   上面CAI演示所示的带求补级的阵列乘法器既适用于原码乘法,也适用于间接的补码乘法。不

过在原码乘法中,算前求补和算后求补都不需要,因为输入数据都是立即可用的。而间接的补码阵

列乘法所需要增加的硬件较多。为了完成所必需的求不予乘法操作,时间大约比原码阵列乘法增

加1倍。

《重要》[例17] =+15,=-13,用带求补器的原码阵列乘法器求出乘积x·y=?

[解:]

  设最高位为符号位,则输入数据为

  []原 =01111    [] = 11101

  符号位单独考虑,算前求补级后 |x|=1111,|y|=1101

  算后经求补级输出并加上乘积符号位1,则原码乘积值为111000011。

  换算成二进制数真值是

x·y=( -11000011)2=(-195)10

  十进制数验证:×y = 15× (-13) = -195相等。

                                       

2.补码乘法           

1.补码与真值得转换公式

  补码乘法因符号位参与运算,可以完成补码数的“直接”乘法,而不需要求补级。这种直接的

方法排除了较慢的对2求补操作,因而大大加速了乘法过程。

  首先说明与直接的补码乘法相联系数学特征。对于计算补码数的数值来说,一种较好的表示

方法是使补码的位置数由一个带负权的符号和带正权的系数。今考虑一个定点补码整数

[N]an-1an-2a1a0,这里an-1是符号位。根据[N]的符号,补码数[N]和真值N的关系

可以表示成:

N

 n-2
+∑ai2i      当an-1 = 0([N]为正)时

 i=0

     n-2
-[1+∑(1-ai)2i] 当an-1 = 1([N]为负)时
     i=0

  如果我们把负权因数-2n-1强加到符号位an-1上,那么就可以把上述方程组中的两个位置

表达式合并成下面的统一形式:

                                   n-2
     N = -an-12n-1+∑ai2i
                                   
i=0

                                              n-2
    -N = -(1-an-1
)2n-1+∑(1-ai)2i +1

                                              i=0

 
 
(2.29)
  
     
 
(2.30)

[例19] 已知: [N] = 01101,[-N]=10011,求[N],[-N]具有的数值。

[解:]

[N]=01101 具有的数值为:

N=-0×24+1×23+1×22+0×21+1×20=(+13)10

[-N]=10011 具有的数值为:

-N=-1×24+0×23+0×22+1×21+1×20=(-13)10

2.一般化的全加器形式

  常规的一位全加器可假定它的3个输入和

2个输出都是正权。这种加法器通过把正权或

负权加到输入/输出端,可以归纳出四类加法

单元。如右表,0类全加器没有负权输入;

1类全加器有1个负权输入和2个正权输入;

依次类推。

对0类、3类全加器而言有:

    SXYZXYZXYZXYZ

    CXYYZZX

对1类、2类全加器,则有

    SXYZXYZXYZXYZ

    CXYXZYZ

 

表2.3 四类一般化全加器的名称和逻辑符号

类型
逻辑符号
操作

0类

加法器

  X
  Y
+) Z
  CS

1类

加法器

   X
   Y
+)-Z
 C(-S)

2类

加法器

  -X
  -Y
+)  Z
 (-C)S

3类

加法器

   -X
   -Y
+) -Z
(-C)(-S)

  注意,0类和3类全加器是用同一对逻辑方程来表征的,它和普通的一位全加器(0类)是一致

的。这是因为3类全加器可以简单地把0类全加器的所有输入输出值全部反向来得到,反之亦然。

1类和2类全加器之间也能建立类似的关系。由于逻辑表达式具有两级与一或形式,可以用

“与或非”门来实现,延迟时间为2T

3.直接补码阵列乘法器

  利用混合型的全加器就可以构成直接补码数阵列乘法器。设被乘数A和乘数B是两个5位的二

进制补码数,即

A=(a4)a3a2a1a0

B=(b4)a3a2a1a0

  它们具有带负权的符号位a4b4,并用括号标注。如果我们用括号来标注负的被加项,例如

(aibJ),那么AB相乘过程中所包含的操作步骤如下面矩阵所示:

                      (a4)  a3  a2  a1  a0  =A
                    ×) (b4)   b3   b2  b1  b0  =B 
                      (a4b0) a3b0 a1b0 a1b0 a0b0
                  (a4b1)  a3b a2b1 a1b1 a0b1
               (a4b2) a3b2  a2b2  a1b2 a0b2

           (a4b3) a3b3  a2b3  a1b3  a0b3
 +)      a4b4 (a3b4) (a2b4) (a1b4) (a0b4)                
      p  p8   p7   p6   p5   p4   p3  p2   p1  p0  =P

  5位乘5位的直接补码阵列乘法器逻辑原理演示

  其中使用不同的逻辑符号来代表0类、1类、2类、3类全加器。2类和1类全加器具有同样的结

构,但是使用不同的逻辑符号可使乘法阵列的线路图容易理解。

  在n位乘n位的一般情况下,该乘法器需要(n-2)2个0类全加器,(n-2)个1类全加器,(2n-3)

个2类全加器,1个3类全加器,总共是n(n-1)个全加器。 故所需的总乘法时间是:

        tp=Ta+2(n-1)Tf=2T+(2n-2)2T=(4n-2)T             (2.31)

[例20] 设[A]=(01101)2,[B]=(11011)2,求[A×B]=?

[解:]

               (0) 1 1 0 1 = + 13
         ×)     (1) 1 0 1 1 = - 5      
               (0) 1 1 0 1
              (0) 1 1 0 1
            (0) 0 0 0 0
           (0) 1 1 0 1
          0 (1)(1)(0)(1)               
          0 (1) 0 1 1 1 1 1 1
         (1) 1 0 1 1 1 1 1 1 = - 65
    

验证:
     -1×270×26+1×25+1×24+1×23+1×22+1×21+1×20
    =-128+(32+16+8+4+2+1) 
    =-65

     (13)×(-5)=-65

                      

你可能感兴趣的:(C++)