2.5我们着重介绍了二进制整数的加、减运算,本次我们继续介绍乘、除运算。本章是迄今为止最难的一章,希望各位猿友有所收获,也别忘了“点个推荐哦”。

引言

运算一直是程序运行当中一个重要的环节,而在二进制的运算过程当中,加法运算又是重中之重,它基本上奠定了二进制运算的基础。因为无论是减法还是乘法,都可以由加法运算来替代,唯有除法不能由加法替代。

了解计算机运算的规律,可以有助于我们理解很多程序代码上无法理解的内容。比如上章提到的溢出问题,在了解了加法运算的原理之后,相信猿友们都可以轻松的知道为何有些运算会得到意想不到的结果。

这里还需要提一点的是,不同的处理器所采取的运算方式可能是有细微的差别的,因此也不能一概而论。因此我们大多时候会尽量讨论运算的抽象数学特性,抽象的东西大部分时候总是可靠的,这种特性为跨平台提供了基础,不过也并非总是如此,毕竟LZ只听说过浮点数运算标准,还没听说过整数运算标准,不知道究竟是LZ孤陋寡闻了,还是确无此物。

正因如此,我们了解一下这些运算的抽象性,会有助于我们理解程序代码级无法理解的东西。

无符号乘法

无符号的乘法与加法类似,它的运算方式是比较简单的,只是也可能产生溢出。对于两个w位的无符号数来说,它们的乘积范围在0到(2w-1)2之间,因此可能需要2w位二进制才能表示。因此由于位数的限制,假设两个w位的无符号数的真实乘积为pro,根据截断的规则,则实际得到的乘积为 pro mod 2w。

补码乘法

与加法运算类似,补码乘法也是建立在无符号的基础之上的,因此我们可以很容易的得到,对于两个w位的补码数来说,假设它们的真实乘积为pro,则实际得到的乘积为 U2Tw(pro mod 2w)。

上面的式子我们有一个假设,就是假设对于w位的两个补码数来说,它们的乘积的低w位与无符号数乘积的低w位是一样的。这意味着计算机可以使用一个指令执行无符号和补码的乘法运算。

在书中给出了这一过程的证明,我们来大概看一下,这里主要应用了无符号编码和补码编码的关系,其中x’和y’分别代表x和y的补码编码。

这里运用的主要技巧就是2w mod 2w = 0。

乘法运算的优化

根据我们小学所学的乘法运算,我们知道,假设两个w位的二进制数相乘,则需要进行w次与运算,然后进行w - 1次加法运算才能得到结果。从此不难看出,乘法运算的时间周期是很长的。因此计算机界的高手们想出了一种方式可以优化乘法运算的效率,就是使用移位和加法来替代乘法。

上述优化的前提是对于一个w位的二进制数来说,它与2k的乘积,等同于这个二进制数左移k位,在低位补k个0。在书中对这一等式进行了证明,过程如下。

这个过程主要应用了无符号编码的公式,各位猿友应该不难看懂。

有了上面的基础,我们就可以使用移位和加法对乘法优化了。对于任意一个整数y,它总能使用二进制序列表示(假设不超过二进制的表示范围),因此我们可以将x和y乘积的二进制序列表示为如下形式(此公式在书中没有展现)。

x * y = x * (yw-12w-1 + ... + y020) =  (x << w-1) * yw-1 +....+ (x << 0 ) * y0

我们举个例子,对于x * 17,我们可以计算x * 16 + x = (x << 4) + x ,这样算下来的话,我们只需要一次移位一次加法就可以搞定这个乘法运算。而对于x * 14,则可以计算 x * 8 + x * 4 + x * 2 = (x << 3) + (x << 2) + (x << 1) ,更快的方式我们可以这么计算,x * 16 - x * 2 = (x << 4) - (x << 1) 。

这里最后需要提一下的是,加法、减法和移位的速度并不会总快于乘法运算,因此是否要进行上面的优化就取决于二者的速度了。

计算机应用乘法,计算机系统原理(十) 二进制整数的乘法运算和除法运算相关推荐

  1. 山东大学 2020级计算机系统原理——拆解二进制炸弹

    写在前面 第一次拿到这个实验还是有点慌!之前没见过,不过还是慢慢做过来了. 这是个需要耐心的过程,请一定静下心来哦! 环境及配置 环境:Ubuntu 20.04 + GDB 调试工具 可参考配置:GD ...

  2. 计算机组成原理14-定点数的乘法与除法运算

    目录 一.乘法运算 1.分析笔算乘法 2.笔算乘法的改进 3.原码一位乘法 4.原码两位乘法 5.补码一位乘法 6.补码两位乘 二.除法运算 1.分析笔算除法 2.原码除法 (1)恢复余数法 (2)加 ...

  3. 计算机进行加法运算的原理,计算机系统原理(九) 二进制整数的加法运算和减法运算...

    引言 平时的编程过程中,当进行整数运算时,经常会遇到一些奇怪的结果,比如两个正数加出负数,两个负数可以加出一个正数,这些都是由于数值表示的有限性导致的.下面我们来看看C语言和Java语言当中的例子. ...

  4. 深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断...

    开篇请各位猿友允许LZ啰嗦几句,最近一直在写计算机系统原理这系列文章,也已经下定决心要把这本书的内容写完.主要目的其实是为了巩固LZ的理解,另外也想把这些内容分享给猿友们,毕竟LZ觉得这些内容对程序猿 ...

  5. c语言无符号扩展,深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断...

    开篇请各位猿友允许LZ啰嗦几句,最近一直在写计算机系统原理这系列文章,也已经下定决心要把这本书的内容写完.主要目的其实是为了巩固LZ的理解,另外也想把这些内容分享给猿友们,毕竟LZ觉得这些内容对程序猿 ...

  6. 大整数算法[09] Comba乘法(原理)

    ★ 引子          原本打算一篇文章讲完,后来发现篇幅会很大,所以拆成两部分,先讲原理,再讲实现.实现的话相对复杂,要用到内联汇编,要考虑不同平台等等. 在大整数计算中,乘法是非常重要的,因为 ...

  7. 深入理解计算机系统(2.5)---二进制整数的加、减法运算(重要)

    2.3我们介绍了无符号编码和补码编码,本次我们来看一下在这两种编码下,整数的运算是如何进行的.看后之余,别忘了"点个推荐哦." 引言 平时的编程过程中,当进行整数运算时,经常会遇到 ...

  8. 微型计算机原理及应用 考研,中山大学《微型计算机系统原理及应用》考研模拟题两套及答案.pdf...

    中山大学<微型计算机系统原理及应用>考研模拟题两套及答案.pdf 考试复习重点资料(最新版)考试复习重点资料(最新版) 封封 面面 第1页 资料见第二页资料见第二页 模拟题一 一.填空题 ...

  9. 计算机系统原理错题整理

    计算机系统原理 想要理解计算机的工作原理,那就来学计算机系统原理鸭! 知识点和错题解析 1.假定"int buf[2]={10,50};"所定义的buf被分配在静态数据区,其首地址 ...

最新文章

  1. 图像有损压缩matlab程序,基于Matlab的灰度图像DCT与RLE的混合有损压缩
  2. ERP成功全球实施十大成功案例
  3. 【跃迁之路】【473天】刻意练习系列232(2018.05.24)
  4. matlab批量对图片进行添加椒盐噪声并批量保存到文件夹
  5. LeetCode 56. 合并区间(优先队列)
  6. android测试空指针什么意思,Android神秘的空指针异常
  7. CCFA中国国际零售创新大会,观远数据用智能分析驱动零售决策
  8. 数字化方法基础_常用函数
  9. Yii2如何使用存取控制过滤器(ACF)
  10. Trakr:自制力差人的计数应用
  11. 哈尔滨啤酒集团有限公司盈利能力分析毕业设计
  12. 整合X-Admin前端框架改造ABP
  13. 【BZOJ】5294: [Bjoi2018]二进制-动态DP线段树
  14. WPF使用GMap.net框架开发地图应用
  15. 宿舍的呼噜神,快看过来,我这里有药!!!
  16. 自动作文评分算法概述
  17. 计算机维修高级工考试员题库,职业技能鉴定国家题库统一试卷高级计算机维修工知识试题...
  18. vscode vuejs项目import报错找不到模块“@/assets/image/BackGroun.png”或其相应的类型声明。
  19. md5 java 工具类_Java常用工具类——MD5
  20. JavaScript note

热门文章

  1. 微软作为金牌会员加入Cloud Foundry基金会
  2. Connect 2016过后,你的信仰势必需要更大的容器
  3. 基于Bootstrap 3.x的免费高级管理控制面板主题:AdminLTE
  4. 微信自定义tabbar有小红点_自定义微信小程序tabBar组件上边框的颜色
  5. 十大排序总结(js实现、稳定性、内外部排序区别、时间空间复杂度、冒泡、快速、直接选择、堆、直接插入、希尔、桶、基数、归并、计数排序)
  6. Python 实现 csv文件转换成json文件
  7. xhr get获取文件流下载文件_python爬虫实战——豆瓣电影get初体验
  8. bootstrap tabale 点击_jquery+bootstrap实现tab切换, 每次切换时都请求数据, 点击提交分别向不同的地址提交数据...
  9. php post授权编写,php模拟post行为代码总结(POST方式不是绝对安全)
  10. mysql的调试与分析_mysql日志管理分析调试实例_MySQL