《计算机组成原理》----2.5 乘除法简介

2023-10-09 09:10

本文主要是介绍《计算机组成原理》----2.5 乘除法简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本节书摘来自华章出版社《计算机组成原理》一书中的第2章,第2.5节, 作 者 Computer Organization and Architecture: Themes and Variations[英]艾伦·克莱门茨(Alan Clements) 著,沈 立 王苏峰 肖晓强 译, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.5 乘除法简介

除了加减法,计算机还必须实现乘法和除法。这两个操作比加减法复杂得多,所需的完成时间也长得多(或需要更复杂的硬件)。这里仅介绍乘法和除法的基本知识。

2.5.1 移位运算

在讨论如何进行二进制乘法之前,我们首先介绍二进制补码数的算术移位运算。本节将其简称为“移位”。进行移位运算时,一个数的所有位都会向左或向右移动一位(例如,将二进制数00101100左移一位,它将变为01011000,右移一位将变为00010110)。有些计算机每次可以移动多位。

二进制补码正数左移一位等价于将该数乘2。十进制数39的二进制表示为00100111,左移一位得到01001110,对应于十进制数78。图2-2a描述了算术左移的过程。空出的最低位补0,移出的最高位保存在计算机的进位标志中,进位标志在图2-2中用C表示。进位标志是计算机中的一个位存储单元,保存了进位位的状态。


1c86c1b18c811e4c4a954b2fa1ba361279141441

图2-2 算术移位运算
11100011左移一位得到11000110。有符号二进制补码数11100011表示十进制数-29。左移一位之后的结果是11000110,表示十进制数-58。

二进制数右移一位相当于它除以2。以00001100(即1210)为例,右移一位得到00000110(即610)。注意,00001101(即1310)右移一位也会得到00000110,也是610。这是因为移出的最低位被丢弃了。

负数右移需要特别注意。简单地将二进制补码负数11100010右移一位,结果为01110001,这显然是不正确的。为了在移位时保持二进制补码数的符号不变,右移时应该像图2-2(b)那样复制符号位。请考虑11100010(即-30)。右移一位同时保持符号位不变将得到11110001,等价于-15。

为什么通过右移一位实现二进制补码数除以2时要在最高位补符号位?二进制正数定义为0xxxx,…,xx,这里x为1或0。将该数除以2,会得到00pppp,…, pp。这个数的补数为1yyyy,…, yy+1(这里每个y是对应的x的补)。现在把00pppp,…, pp转换为负数,会得到11qqqq,…, qq+1。正如我们所看到的那样,无论是正数还是负数,右移时符号位都应保持不变。

2.5.2 无符号二进制乘法

请回顾人们在纸上笔算两个数乘法的过程。这里之所以强调人们是因为计算机不会像人那样进行乘法运算——它是将所有部分积加到一起。计算机从乘数的最低位开始,每次检查一位,判断它是否为0。如果乘数的当前位为1则写下被乘数,若该位为0则写下n个0。接下来检查乘数的下一位,但这时应从上一个数的左边一位开始写下被乘数(或0)。被写下的这一组数叫作部分积。在得到所有的部分积之后,将它们加到一起,得到乘法的结果。


8ef4df18a37ebfde6c6e2b95e055904d5f837fed

乘法的结果100000102 = 13010是个8位二进制数。两个n位二进制数相乘会得到一个2n位的积。正如前面提到的那样,数字计算机并没有实现上面的算法,因为这种算法要求计算机存储n个部分积,然后将它们同时相加。一种更好的技术是每得到一个部分积时就做一次加法。图2-3给出了一个计算两个n位无符号二进制数相乘的算法。请考虑用图2-3描述的算法计算1101 × 1010的例子。表2-3给出了其计算过程。


614e80e60cba088767c0f58bd602aef47c93f6e3
2.5.3 快速乘法

这种通过移位和加法实现的乘法速度很慢。实际的计算机采用了多种方法加快乘法运算的速度。例如,构造专门的逻辑阵列直接得到两个数的积而不必对操作数移位。


6d341807bec392ca98f03497c96a76bb32aafdab


85a3b2f7460261515606b388edbdeae625d4b07d

有些程序员使用移位和加法等速度相对较快的操作以避免使用乘法。请考虑P乘以10和乘以9这两个例子。

10P = 2×(2×2×P + P);即将P左移两次,加上P,再将和左移一次。

9P = 2×2×2×P + P;即将P左移三次,加上P得到结果。

乘法运算也可以借助查找表(look-up table)实现,这种方法将两个数相乘所有可能的积都保存在一个只读存储器内。这样,只需简单地用X和Y的值找到表中的对应项就可以得到X和Y的乘积。例如,两个8位二进制数乘法需要一个16位地址(即两个8位字)、216项的查找表,每项记录了一个16位的积。计算00001010乘以00111100的积只需读出地址为0000101000111100的项的内容00000010010110000。

这种方法的缺点在于所需ROM的容量随着乘数和被乘数位数的增加呈指数增长。n位乘法需要的ROM容量为2n×22n位;例如8位乘法需要容量为16×216位的ROM。

可以用一个简单的方法来减少查找表的大小。假设要计算两个16位数A与B的乘积。可以将16位数A拆分为两个8位数Au和Al,这里Au是A的高8位而Al是A的低8位。如果A=1111000010101010,则Au=11110000,Al=10101010。A可被表示为Au×256+Al,B可被表示为Bu×256+Bl。现在,请考虑乘积A×B。

A×B=(Au×256+Al)×(Bu×256+Bl)=65536AuBu+256AuBl+256AlBu+AlBl

这个表达式需要计算4个8位乘积(AuBu,AlBu,AuBl,AlBl),将积左移16位或8位(即乘以65536或256),以及将4个部分积相加等操作。这样,可以用8位乘法和4个加法来完成16位乘法。实际上,借助硬件有很多办法可以加快乘法运算的速度。

2.5.4 除法

除法是通过被除数不断地减去除数直到结果为零或小于除数来实现的。减去除数的次数称作“商(quotient)”,最后一次减法的差称作“余数(remainder)”。也就是说,

被除数/除数 = 商 + 余数/除数

在讨论二进制除法之前,我们首先看看人们在纸上笔算完成十进制除法的过程。下面的算式描述了575除以25的过程。


5e4f6e89274e80de7748e717a2c9f7ae81e0c017

第一步是比较除数和被除数的最高两位,看看被除数的最高两位中有几个除数。这个例子中答案为2(即2×25 = 50),并用57减去2×25。在商的最高位上写下数字2,得到下面的算式。
QQ_20170526172641

将被除数的下一个数字5移下到7的后面,并比较除数和75。由于75正好是25的整倍数,因此应在商的下一位上写下数字3并得到


a82979fee8208d0f9a10be2b1e9d16a222e40b39

因为已经处理到被除数的最后一位且75正好是除数的整倍数,因此除法结束,商为23,余数为0。上述除法过程的难点在于估计部分被除数中有多少个除数(即57除以25等于2余7)。请考虑用无符号二进制除法完成同样的例子。


81f74b2193fc282cc68656fd9c92f4f0081c457f


4dd636afe1fac309fc0eec67e50491628adc592a

被除数的前5位比除数小,因此商的最高位商0并将除数与被除数的前6位比较。


96821ebe9d07e1f508e7edeaec3e5bc73450bcde

被除数的前6位中有一个除数,减法后得到新的部分被除数为001010(1111)。将被除数的下一位移下来,可得


fe050bd6260fce8b050a963f0d3d009b4589b83d

新的部分被除数小于除数,因此商的下一位商0。后续的除法过程如下:


78bdcf8590f99c1ff1776029e73bfea626e9e32b

除法结果商为10111,余数为0。
1.恢复余数除法
稍加改动,刚才讨论的除法方法就可以以数字形式实现。唯一需要修改的就是除数与部分被除数的比较方法。人们用心算进行比较,而计算机必须做减法并检测结果的符号位。如果减法的结果为正,则商1,但若结果为负,则应商0并将部分被除数与除数相加,将其恢复为原先的值。

下面是一个可行的恢复余数除法算法。
1)将除数的最高位与被除数的最高位对齐。
2)从部分被除数中减去除数,得到新的部分被除数。
3)若新的部分被除数为负,则商0并用新的部分被除数加上除数,恢复原先的部分被除数。
4)若新的部分被除数为负,则商1。
5)判断除法是否结束。若除数的最低位与部分被除数的最低位对齐,则除法结束。最后的部分被除数就是余数。否则,执行第6步。
6)将除数右移1位。从第2步继续执行。

图2-4描述了该算法的流程图。下面按照该流程计算011001112除以10012,即十进制数103除以9,其结果为商11余4。表2-5逐步列出了除法的过程。


955ad447f4ab99dd148b4473e197ceed7faca653

2.不恢复余数除法
改进图2-4中的恢复余数除法可以减少除法的延迟。不恢复余数除法与恢复余数法基本相同,唯一的区别在于它取消了恢复余数的操作。在恢复余数除法中,在部分被除数与除数相加恢复部分被除数之后的一个周期,部分被除数将减去除数的二分之一。每个将除数右移的操作等价于将除数除以2。当前周期恢复部分被除数以及下个周期减去除数一半的操作等价于部分被除数加上除数的一半。即D - D/2 = +D/2,这里D为除数。

图2-5给出了不恢复余数除法的流程图。部分被除数减去除数之后,将检测新的部分被除数的符号位。若为负,则商左移1位,商的最低位补0,并将部分被除数加上除数的二分之一。若为正,则商左移1位,商的最低位补1,并将部分被除数减去除数的二分之一。表2-6列出了用不恢复余数除法完成表2-5中算例的过程。


09533cf11dcc0563481fb9ebffb0fbc825dfdfa9


63963faf7118589e9251769ea526ff53cb2f9ed3

这篇关于《计算机组成原理》----2.5 乘除法简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/171786

相关文章

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

最便宜的8口2.5G网管交换机! 水星SE109 Pro拆机测评

《最便宜的8口2.5G网管交换机!水星SE109Pro拆机测评》水星SE109Pro价格很便宜,水星SE109Pro,外观、接口,和SE109一样,区别Pro是网管型的,下面我们就来看看详细拆... 听说水星SE109 Pro开卖了,PDD卖 220元,于是买回来javascript拆机看看。推荐阅读:水

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和