zoukankan      html  css  js  c++  java
  • 原码一位乘法与补码一位乘法

    原码1位乘法

    在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号按异或运算得到。而乘积的数值部分则是两个正数相乘之积。设n位被乘数和乘数用定点小数表示(定点整数也相同适用)

    被乘数 [x]原 = xf .xxx2 … xn        

    乘数   [y]原 = yf .yyy2 … yn

    乘积   ]原 = ( xf⊕yf ) . (0. xxx2 …xn)(0 . yy2 …yn)

    式中,xf为被乘数符号。yf为乘数符号。

    乘积符号的运算法则是:同号相乘为正,异号相乘为负。因为被乘数和乘数和符号组合仅仅有四种情况(xyf = 00,01,10,11),因此积的符号可按“异或”(按位加)运算得到。

    数值部分的运算方法与普通的十进制小数乘法相类似。只是对于用二进制表达的数来说,其乘法规则更为简单一些:从乘法y的最低位開始。若这一位为“1”。则将被乘数x写下;若这一位为“0”,则写下全0。然后再对乘数y的高一位进行的乘法运算,其规则同上,只是这一位乘数的权与最低位乘数的权不一样。因此被乘数x要左移一位。依次类推。直到乘数各位乘完为止。最后将它们统统加起来。便得到最后乘积。  

    补码1位乘法

    原码乘法的主要问题是符号位不能參加运算,单独用一个异或门产生乘积的符号位。

    故自然提出是否能让符号数字化后也參加乘法运算,补码乘法就能够实现符号位直接參加运算

    设被乘数 [x]补 = x0.x1x2…xn 和乘数 [y]补 = y0.y1y2…yn 均为随意符号,则有补码乘法算式

      [ · ]补 = [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 为尾数位数。

  • 相关阅读:
    [转]Linq使用心得——SelectMany替代二重foreach循环
    设计模式—装饰者模式
    设计模式—桥接模式
    iOS_autoLayout_Masonry
    排序算法
    h.264硬件解码
    FFmpegh.264解码
    AAC编解码
    socket UDP简单通讯
    socket TCP简单通讯
  • 原文地址:https://www.cnblogs.com/l20902/p/10610919.html
Copyright © 2011-2022 走看看