• 定点数乘法


    原码乘法:

      原码的手动乘法:就和小学学过的竖式乘法写法一致,从右到左,乘数每一位分别与被乘数相乘。

              1011

          x  1101

    -------------------

             1011

           0000

         1011

       1011

    ----------------

     10001111

    原码的一位乘法:

    原理:从传统竖式乘法里面可以看到,每次乘数只有一位与被乘数相乘。如果用乘数的最低位和被乘数相乘,再把它右移一位,就可以作为部分积,和下一位相乘后的结果相加。

    具体计算:

      符号位最后单独处理,绝对值参加乘法运算。该算法因为每次根据乘出的一位来计算位积,所以称为原码一位乘法。

    步骤:初始部分积为0,Yi为1;若Yi为0,部分积加|X|,累加结果右移一位,得到新部分积;(i依次为n n-1 n-2....)

    符号位异或运算。

    为什么要右移:对于乘数,最后一位已经用过了,没有价值,所以直接右移丢弃掉,剩下的空间刚好用来存储部分积右移的部分。换句话说,部分积可以视为在乘数左侧,每次右移挤占乘数空间

    例题:

      以+1011  *   -1101为例做一位乘法

      初始的部分积为0,0000,0表示正数,不参与计算。部分积实际为0000.                数据显示:0000 1101

      1)用乘数1101的最后一位1乘1011 并加上之前的部分积0000,结果为1011,

    部分积右移一位,挤占乘数1101的位置,乘数变成了1110,部分积变成0101           数据显示: 0101 1110

       2)用乘数1110的最后一位0乘1011,并加上部分积,结果为0101        数据显示: 0101 1110

    部分积右移,挤占乘数,乘数变成1111,部分积变成0010              数据显示: 0010 1111

      3)用乘数1111的新最后一位1乘1011,并加上部分积,结果为1101          数据显示: 1101 1111

    部分积右移,挤占乘数,乘数变成1111,部分积变成0110              数据显示: 0110 1111

       4)用乘数1111的新最后一位1乘1011,并加上部分积,结果为0001      数据显示: 0110 1111

    部分积右移,挤占乘数,乘数变成1111,部分积为1000            数据显示:1000 1111

    与乘数1111拼接

    最终结果为1,1000 1111                前面的1表示负数

    -------------

    补码一位乘法

    在计算机中用补码运算较为方便。补码乘法运算时,可以将补码的数值部分同原码一样直接做乘法,在根据乘数符号位做修正即可。

    在修正X*Y时,Y的符号位为0不用修正,Y的符号位为1 时减去X

    此外,补码的符号位可以直接参加运算,不用单独处理;并且他们需要两位符号位

    举例:

    X为+0.1011  Y为-0.1101

    转化为补码后,X为00.1011  Y为11.0011

    计算大致同上述步骤。由于Y的符号位为11,因此计算结果00.0010 0001要减去X补码,也就是加上-X补码

    实际结果为1.0111 0001

    转化为原码是-0.1000 1111

    转换为原码的话为-0.1000 1111

  • 相关阅读:
    【C++】对象模型之Function
    linux扩展磁盘
    swift文件操作
    WEEK丢人周
    swift upload
    桌面管理器
    linux 撤销软件卸载
    声明Complex类,成员变量包括实部和虚部,成员方法包括实现由字符串构造复数、复数加法、减法,字符串描述、比较相等等操作
    eclipse踩坑
    QQ语音消息提取 amr文件解密
  • 原文地址:https://www.cnblogs.com/namezhyp/p/14159978.html
Copyright © 2020-2023  润新知