zoukankan      html  css  js  c++  java
  • 补码一位乘(布斯公式)

    转自:http://ep02.blog.163.com/blog/static/67655853200821842019254/

    本文适用于补码表示的定点小数定点整数乘法运算(硬件或软件实现) 

    ◆ 先考查两个补码乘法运算的例子
    例1: 已知 X=0.1011,Y=0.0001(真值)
    [X]=01011 , [Y]= 00001
    [X*Y]=000001011
    [X]*[Y]=000001011
    这时有,[X*Y]=[X]*[Y]

    例2: 已知 X=0.1011,Y= - 0.0001(真值)
    [X]=01011 , [Y]= 11111
    [X*Y]=111110101
    [X]*[Y]=101010101
    显然,[X*Y]  [X]*[Y]

    ▲ 对两个正数来说,它们补码的乘积等于它们乘积的补码。若乘数是负数时,这种情况就不成立了。

    原码乘法的主要问题是符号位不能参加运算,单独用一个异或门产生乘积的符号位。故自然提出能否让符号数字化后也参加乘法运算,补码乘法就可以实现符号位直接参加运算。

    为了得到补码一位乘法的规律,先从补码和真值的转换公式开始讨论。(以纯小数为例)

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

    设 [x] = x. x1x2xn ,有:

     

                          n                   
    x = - x0+∑  xi2-i     
                       i=1 

     

    等式左边 x 为真值。此公式说明真值和补码之间的关系。

    2.  补码的右移

    正数右移一位,相当于乘1/2(即除2)。负数用补码表示时,右移一位也相当于乘1/2。因此,在补码运算的机器中,一个数不论其正负,连同符号位向右移一位(即符号扩展),若符号位保持不变,就等于乘1/2。

    3.  补码乘法规则

    设被乘数 [x] = x0.x1x2xn 和乘数 [y] = y0.y1y2yn (注意:包括符号位共n+1位)均为任意符号,则有补码乘法算式

     

                                                 n  
      [x·y]= [x]·( -y0+∑ yi2-i )
                                                        i=1 

     

    为了推出串行逻辑(递推),实行分步算法,将上式展开加以变换:

    [x·y]   = [x]·[ - y0 + y12-1 + y22-2 + … + yn2-n]

              = [x]·[ - y0 + (y1 - y12-1) + (y22-1 - y22-2) + … + (yn2-(n-1) - yn2-n)]

              = [x]·[(y1 - y0) + (y2 - y1) 2-1 + … + (yn - yn-1) 2-(n-1) + (0 - yn)2-n]

              = [x]·[...................................] (yn+1  =  0)   

     

                   

    写成递推公式如下:

             z] = 0 (赋初值0)

            z] = 2 -1z]补 +  (  yn+1 - yn ) [x]补 }       (yn+1  =  0)

    ; 注:2 -1表示右移,带符号扩展。补码的加减法在移位时不考虑进位C

                    

            z] = 2 -1zi-1 ]补 +  ( yn-i+2 yn-i+1 ) [x] }             

                    

            z] = 2 -1{ [ zn-1 ]补 +  ( y2 - y) [x]补 }

             zn+1 ] = [ z]补 +  (  yy) [x] = [ x·] 此最后一步不需要移位(对纯小数!)

    开始时,部分积为 0,即 [z0] = 0。然后每一步都是在前次部分积的基础上,由 ( yi+1  -  yi  ) ( i = 0,1,2,…,n) 决定对[x]的操作,再右移一位,得到新的部分积。如此重复 n + 1步,最后一步不移位,便得到 x·] ,这就是有名的Booth布斯算法

    实现这种补码乘法规则时,在乘数最末位后面要增加一位补充位 yn+1 。开始时,由 ynyn+1 判断第一步该怎么操作;然后再由 yn - 1 yn 判断第二步该怎么操作。因为每做一步要右移一位,故做完第一步后, yn - 1 yn 正好移到原来 ynyn+1 的位置上。依此类推,每步都要用 ynyn+ 1 位置进行判断,我们将这两位称为判断位

    如果判断位 ynyn+1 = 01,则 yi+1 yi  = 1,做加[x]操作;

    如果判断位 yn yn+1 = 10,则 yi+1 -yi  =  - 1,做[ - x](或者-[x])操作;

    如果判断位 yn yn+1 = 11 或 00,则 yi+1yi  = 0,z] 加0,即保持不变。

    4. 补码一位乘法运算规则

    (1) 如果 yn = yn+1,部分积 z] 加0,再右移一位;

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

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

    这样重复进行 n+1 步,但最后一步不移位(对纯小数)。包括一位符号位,所得乘积为 2n+1 位,其中 2n 为尾数位数。对于码整数相乘,最后一步也要移位!乘积有2n+2 位,其中 2n 为尾数位数

    【例 】  x  = 0.1101, y = 0.1011,用补码一位乘法计算 x·y = 

    [解:]     求解过程如下:

     

     

     

     

    部分积

     

     

    乘数

    说明

     

     

     

    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

     

     

    实现32位Booth乘法算法的流程图

    例:用Booth算法计算2×(-3)。

      解:[2]=0010,[-3]=1101,在乘法开始之前,R0和R1中的初始值为0000和1101,R2中的值为0010。

      在乘法的第一个循环中,判断R1的最低位和辅助位为10,所以进入步骤1c,将R0的值减去R2的值,结果1110送人R0,然后进人第二步,将R0和Rl右移一位,R0和R1的结果为11110110,辅助位为l。
      在第二个循环中,首先判断Rl的最低位和辅助位为0l,所以进入步骤1b,作加法,R0+R2=1111+0010,结果0001送入R0,这时R0R1的内容为0001 0110,在第二步右移后变为0000 1011,辅助位为0。
      在第三次循环中,判断位为10,进入步骤lc,R0减去R2,结果1110送入R0,R1不变;步骤2移位后R0和R1的内容为1111 01011,辅助位为1。
      第四次循环时,因两个判断位为11,所以不作加减运算,向右移位后的结果为1111 1010,这就是运算结果(—6)。
      这个乘法的过程描述如下表所示,表中乘积一栏表示的是R0、R1的内容以及一个辅助位P,黑体字表示对两个判断位的判断。

    Booth补码一位乘法计算2 ×(-3)的过程 

    循环

    步骤

    乘积(R0,R1, P)

    0

    初始值

    0000 1101 0

    1

    1c:减0010

    1110 1101 0

    2:右移1位

    1111 0110 1

    2

    1b:加0010

    0001 0110 1

    2:右移1位

    0000 1011 0

    3

    1c:减0010

    1110 1011 0

    2:右移1位

    1111 0101 1

    4

    1a:无操作

    1111 0101 1

    2:右移1位

    1111 1010 1

     

     
  • 相关阅读:
    MySQL和hive对比表结构脚本
    服务器端口3次不通报警
    CentOS 7 安装以及配置桌面环境
    MySQL修改参数不重启生效
    linux mysql 5.7.17 编译安装小记
    react脚手架应用以及iview安装
    weex具体安装教程
    npm教程2——脚手架原理及jQuery和bootstrap引入
    npm具体安装教程
    JAVA学习总结(六)
  • 原文地址:https://www.cnblogs.com/xisheng/p/9260861.html
Copyright © 2011-2022 走看看