zoukankan      html  css  js  c++  java
  • 计算机组成原理-原码补码的一位乘法

    这个学期一直上网课,全都是看视频,所以没看过书。对于一些知识点只是看PPT理解,所以有很多知识点不知其所以然,最近复习开始看书才发现其中的奥妙,简直是妙不可言。

    以下内容来自《计算机组成原理》唐朔飞的教材。

    手算乘法对于接受过义务教育的我们应该不是问题,那么我就直接上手算二进制乘法的改进版。

    手算二进制的改进

    (A=0.1101)(B=0.1011),求(A×B)

    [egin{aligned}A cdot B &=A cdot 0.1011 \&=0.1 A+0.00 A+0.001 A+0.0001 A \&=0.1 A+0.00 A+0.001(A+0.1 A) \&=0.1 A+0.01[0 A+0.1(A+0.1 A)] \&=0.1{A+0.1[0 A+0.1(A+0.1 A)]} \&=2^{-1}left{A+2^{-1}left[0 A+2^{-1}left(A+2^{-1} A ight) ight] ight} \&=2^{-1}left{A+2^{-1}left[0 A+2^{-1}left(A+2^{-1}(A+0) ight) ight] ight}end{aligned} ]

    通过上式可见,两数相乘的过程,可以视为加法和位移两种运算,这对计算机来说是非常容易实现的。

    下图是具体实现的计算步骤:

    实现上述步骤需要用一个寄存器存放被乘数,一个寄存器存放乘积的高位,另一个寄存器存放乘数乘积的低位

    原码一位乘法

    由于原码与真值之间只相差一个符号,而乘积的符号又可通过两数符号的逻辑异或求得,所以上述运算可直接用于原码一位乘,只需要对符号位进行处理就行了。

    原码一位乘运算规则:

    [[x]_原 = x_{0}.x_{1} x_{2} cdots x_{n} ]

    [[y]_原 = y_{0}.y_{1} y_{2} cdots y_{n} ]

    [[x]_原·[y]_原=x_0oplus y_0(0.x_1x_2cdots x_n)(0.y_{0}.y_{1} y_{2} cdots y_{n}) ]

    式中(0 . x_{1} x_{2} cdots x_{n})(0 . y_{1} y_{2} cdots y_{n})是x和y的绝对值,记作(x^*)(y^*)

    补码一位乘法

    被乘数([x]_补 = x_{0}.x_{1} x_{2} cdots x_{n}),乘数([y]_补 = y_{0}.y_{1} y_{2} cdots y_{n})

    1. 被乘数x符号任意,乘数y符号为正

    [egin{equation}egin{array}{l}{[x]_{ ext {补 }}=x_{0} cdot x_{1} x_{2} cdots x_{n}=2+x=2^{n+1}+x (mod 2 )} \{[y]_{ ext {补 }}=0 . y_{1} y_{2} cdots y_{n}=y} \{[x]_{ ext {补 }} cdot[y]_{ ext {补 }}=[x]_{ ext {补 }} cdot y=left(2^{n+1}+x ight) cdot y=2^{n+1} cdot y+x y}end{array}end{equation} ]

    下面这一串等式很重要,一定要看懂:

    [egin{equation}y=0 . y_{1} y_{2} cdots y_{n}=sum_{i=1}^{n} y_{i} 2^{-i}, ext { 则 } 2^{n+1} cdot y=2 sum_{i=1}^{n} y_{i} 2^{n-i}end{equation} ]

    按照我的理解:(y_i)中至少有一个为1,否则(y=0),而且(n≥i),所以(2^{n-i}≥1),可得到(sum_{i=1}^{n}y_i2^{n-i}≥1),进而(2 sum_{i=1}^{n} y_{i} 2^{n-i})的结果是2的整数倍,所以有 (2^{n+1}·y=2(mod2))

    则:

    [[x]_{ ext {补 }} cdot[y]_{ ext {补 }}=2^{n+1} cdot y+x y=2+x y=[x cdot y]_{ ext {补 }} quad(mod 2) ]

    即:

    [[x cdot y]_{ ext {补 }}=[x]_{ ext {补 }} cdot[y]_{补}=[x]_{ ext {补 }} cdot y ]

    1. 被乘数x任意符号,乘数y符号为负

    [egin{equation}egin{array}{l}{[x]_{ ext {补 }}=x_{0} cdot x_{1} x_{2} cdots x_{n}} \{[y]_{ ext {补 }}=1 cdot y_{1} y_{2} cdots y_{n}=2+y(mod 2)}end{array}end{equation} ]

    则:

    [egin{equation}egin{aligned}y &=[y]_{ ext {补 }}-2=1 . y_{1} y_{2} cdots y_{n}-2=0 . y_{1} y_{2} cdots y_{n}-1 \x cdot y &=xleft(0 . y_{1} y_{2} cdots y_{n}-1 ight) \&=xleft(0 . y_{1} y_{2} cdots y_{n} ight)-xend{aligned}end{equation} ]

    故:

    [egin{equation}[x cdot y]_{ ext {补 }}=left[xleft(0 . y_{1} y_{2} cdots y_{n} ight) ight]_{ ext {补 }}+[-x]_{ ext {补 }}end{equation} ]

    (0 . y_{1} y_{2} cdots y_{n})视为一个正数,正好与上述情况相同。所以:

    [egin{equation}[x cdot y]_{ ext {补 }}=[x]_{ ext {补 }}left(0 . y_{1} y_{2} cdots y_{n} ight)+[-x]_{ ext {补 }}end{equation} ]

    乘数为负的补码乘法与乘数为正的乘法类似,只需最后加上一项校正项(-[x]_补)即可。

    需要注意的是:在相加和移位时要按照补码规则进行。

  • 相关阅读:
    调整精力记录
    cucumber系列(四) RubyGems下载源更新的问题
    cucumber系列(三)BDD与相关测试框架资料收集
    cucumber系列(二) cucumber的基本操作命令
    cucumber系列(一) 如何让cucumber识别中文
    centos与ubuntu的区别 (转)
    Excel 导出组件,10W级数据5秒内导出
    如何本地调试测试环境的代码
    .net core 在Startup.cs 的Configure方法中扩展 IApplicationBuilder
    mysql 统计一周每天得数据
  • 原文地址:https://www.cnblogs.com/xxmmqg/p/12944853.html
Copyright © 2011-2022 走看看