专栏首页最高权限比特流漫谈计算机组成原理(九·续)定点数的运算方法

漫谈计算机组成原理(九·续)定点数的运算方法

本文讲什么?

在上一篇文章中,我们主要讲述了定点数的加、减、乘运算,唯独没有讲解除法运算。原因有两个,一来上一篇文章的内容确实比较多,二来除法运算比乘法相对复杂。 所以,本文将从除法的来历讲起,然后讲除法运算的几种方法。

除法运算的形成

我们来看这样一个例子:在8位寄存器中存储了00000111,4位寄存器中存储了0010,计算00000111/0010。 回想一下,我们整数的除法是怎么做的?如上面的数改写成十进制,即7/2的结果是多少呢? 我们肯定是先列出一个除法式子,像下面这样。

我们首先是判断一下,当前被除数7中有几个除数,有几个则商就上几个,然后被除数减去除数乘商得到余数,接着判断余数中有几个除数,直到除不开为止。如果发现商是0,则被除数补0,除数向右移动一位,继续计算。 在7中有3个2,结果是余1,1中不存在2,这就是最终的结果。 接着看一下上面的例子:我们要做的,肯定是先列出一个式子。

和整数除法一样,两个二进制数之间的除法同样的。步骤如下:

  • 要判断被除数中有几个除数
  • 有几个则商上几,有n个除数商就是n(二进制除法中,结果不是1就是0)
  • 被除数-n*除数 = 被除数’
  • 除数向右移动一位
  • 继续上述过程,得到最终结果

大体上的过程就是这样的。根据上述的过程,我们能够很容易的设计出基本的除法器。此外,要注意的是,除法器应该具有判断除数或者被除数是否为0的功能,因为被除数为0时结果为0,没有意义;而除数为0时,结果为无穷大,无法表示。

计算机定点数除法运算的几种方法

在了解了除法器的基本情况后,我们就来讲除法运算的两种方法。分别是:恢复余数法、加减交替法。

恢复余数法

从名字中可以看出,这种方法对余数做了某种恢复。为什么会出现这种恢复呢?原因很简单,我们在分析一般除法的过程中可以看到,如果除数和被除数当前对齐的位上,被除数有0个除数,此时我们就需要将被除数补0。但是计算机并不知道被除数是否够除除数(因为不管除数和被除数的情况如何,最后的商上的位,不是0就是1),就需要先用被除数减去除数,如果发现余数是小于0的,那么计算机就知道了此时对齐的位无法得到最终的结果,则将被除数向又移动一位。这就是恢复余数法的核心思想。当然,我们在直接计算的时候,需要将两个数的绝对值相除,再得到最终的结果。 接下来我们就来看,恢复余数法究竟是如何运算的。

  • 例子:x=-0.1011,y=-0.1101,求[x/y]原 因为需要使用两个数的绝对值运算,所以我们先得到两个数的绝对值。 [x]原=1.1011,[x*]=0.1011;[y]原=1.1101,[y*]=0.1101。 还有,在运算时,因为涉及到两个数的减法,所以我们需要得到[-y*]补。 [-y*]补=1.0011.计算过程如下表。

初始化的时候,被除数放到被除数的位置,而商为0.先减去除数,如果余数为正,则商上1,否则上0,接着将被除数加上除数。无论哪种情况,都需要将被除数向左移动一位。这就是恢复余数法的过程。最终,别忘了使用异或操作得到符号位,才能得到最终结果。

加减交替法

加减交替法也称作不恢复余数法。为啥呢,因为在加减交替法中,先让被除数减除数,如果结果为正,则上1,;如果结果为负,则加上除数。接着将被除数向做移动一位。不过你要是细看的话,这两种方法其实并没有太大的区别,自己好好体会一下就行了。 下面看个例子:

  • 例子:x=0.1011,y=0.1101,求[x/y]原。 [x]原=1.1011,x*=0.1011;[y]原=0.1101,y*=0.1101,[-y*]补 = 1.0011。 计算过程如下:

结语

本节是承接定点数的计算方法的,下一节,我们将开始计算机的运算方法后半部分的内容,即浮点数的计算过程,内容并不多,所以会放到一篇文章中。 如果你喜欢我的文章,欢迎关注我的微信公众号:最高权限比特流

参考:《计算机组成原理》唐朔飞

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • idea配置tomcat

    roobtyan
  • idea抛出异常:org.apache.shiro.authc.AuthenticationException

    继续在ubuntu下折腾,终于将web项目的所有的东西配置好了,然后运行项目,满怀期待的心情登录系统的时候,突然出现了这个bug,吓得我差点从椅子上跳起来,这两...

    roobtyan
  • Java中常用的API(二)——String

    在第一节中我们介绍了Object类的方法以及操作,那么这一节,我们将介绍一个新的类:String。 String类是我们经常使用的类,应用十分广泛。同时,S...

    roobtyan
  • 爬虫还担心验证码问题吗?这你给你解决方案!

    这里使用了 pytesseract 来进行验证码识别,它是基于 Google 的 Tesseract-OCR ,所以在使用之前需要先安装 Tesseract-O...

    1480
  • Python中有关链表的操作(经典面试内

         遍历使用一个临时的指针变量,这个变量先初始化为链表结构的head指针,然后控制一个循环。

    py3study
  • Multiple substitutions specified in non-positional format

    as3.0以上在gradle.properties使用android.enableAapt2=true,as就会提示将要过期了,请设置成 android.en...

    ppjun
  • 直男 or Gay?看看你的DNA标记!

    大数据文摘
  • ReactHooks源码解析之useState及为什么useState要按顺序执行

    从本篇开始,我们讲 React-Hooks 最常用的几个函数,先通过例子来看下React.useState():

    进击的小进进
  • 中文项目:快速识别验证码,CNN也能为爬虫保驾护航

    本项目使用卷积神经网络识别字符型图片验证码,其基于 TensorFlow 框架。它封装了非常通用的校验、训练、验证、识别和调用 API,极大地减低了识别字符型验...

    机器之心
  • Linux搭建Tomcat服务配置域名访问+修改端口,并且测试jsp

    ================================================================================...

    对弈

扫码关注云+社区

领取腾讯云代金券