原码一位乘和补码一位乘

    今天学习了计算机中乘法的运算:原码一位乘和补码一位乘,在这做个笔记,顺便检验一下学习成果,有不足的地方希望大家不吝指教!

1.原码一位乘

首先注意,在乘法运算中,同号为正,异号为负。在这里我们用异或符号表达符号位:

被乘数 [x] = x.xxx xn        

乘数   [y] = yf .yyy yn

两者乘积   ] = ( xfy) . (0. xxxxn)(0 . yyyn)

原码一位乘和我们认识中的乘法运算一样,只不过在计算机内部采用移位的方法。
例如, 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,部分积 [ z] 加0,再右移一位;

(2) 如果 yn yn+1 = 01,部分积加[ x ],再右移一位;

(3) 如果 yn yn+1 = 10,部分积加[ -x ],再右移一位;

这样重复进行 n+1 步,但最后一步不移位,包括一位符号位。

由运算规则可知,我们要求出

被乘数x的[ x ]补,[ -x ],根据乘数ynyn+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



  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(1)用[X]补×[Y]补直接求[X×Y]补 讨论当相乘的两个数中有一个或二个为负数的情况,在讨论补码乘法运算时,对被乘数或部分积的处理上与原码乘法有某些类似,差别仅表现在被乘数和部分积的符号位要和数值一起参加运算。 若[Y]补=Y0Y1Y2…Yn 当Y0为1时,则有Y=-1+Yi×2-i 故有 X×Y=X×Yi×2-1-X当Y为负值时,用补码乘计算[X×Y]补,是用[X]补乘上[Y]补的数值位,而不理[Y]补符号位上的1,乘完之后,在所得的乘积中再减X,即加-[X]补。实现补码乘法的另一个方案是比较法,是由BOOTH最早提出的,这一方法的出发点是避免区分乘数符号的正负,而且让乘数符号位也参加运算。技巧上表现在分解乘数的每一位上的1为高一位的一个+1和本位上的一个-1:X×Y=X×(-1+Yi×2i) (逐项展开则得)=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×(Yi+1-Yi)×2-i(写成累加求和的形式,得到实现补码乘运算的算法)将上述公式展开,则每一次的部分积为: P1=[2-1(Yn+1-Yn) ×X]补 P2=[2-1(P1+(Yn-Yn-1) ×X)]补 … Pi=[2-1(Pn-i+(Yn-I+2-Yn-I+1) ×X)]补 … Pn=[2-1(Pn-1+(Y2-Y1) ×X)]补 Pn+1=[ (Pn+(Y1-Y0) ×X)]补 则最终补码乘积为[X*Y]补=[Pn+1]补 由上述公式可以看出,比较法是用乘数中每相邻的两位判断如何求得每次的相加数。每两位Yi和Yi+1的取值有00,01,10,11四种组合,则它们的差值分别为0,1,-1和0,非最后一次的部分积,分别为上一次部分积的1/2(右移一位)的值Rj,Rj+[X]补,Rj-[X]补(即Rj+[-X]补)和Rj,但一定要注意:最后一次求出的部分积即为最终乘积,不执行右移操作。用此法计算乘积,需要乘数寄存器的最低一位之后再补充一位Yn+1,并使其初值为0,再增加对Yn和Yn+1两位进行译码的线路,以区分出Yn+1-Yn 4种不同的差值。对N位的数(不含符号位)相乘,要计算N+1次部分积,并且不对最后一次部分积执行右移操作。此时的加法器最好采用双符号位方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值