《逻辑与计算机设计基础(原书第5版)》——1.4 算术运算

简介: 本节书摘来自华章计算机《逻辑与计算机设计基础(原书第5版)》一书中的第1章,第1.4节,作者:(美)M.莫里斯·马诺(M. Morris Mano)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.4 算术运算

r进制的算术运算方法和十进制类似。但是,在r进制的情况下,要特别注意只有r个基本数字可用,而且所有的计算是逢r进1。下面是两个二进制数的加法计算例子(注意做加法运算的操作数的名称):
image

除了每位的和只可能是0和1以外,二进制的加法和十进制的加法规则一样。当然,在二进制加法中,当某位的和大于1时就会产生进位(而在十进制中,只有当和大于9才会产生进位),进位都会加入到临近的高位。在第一个例子中,因为所有的进位都为0,所以和就相当于被加数与加数的各位简单相加。在第二个例子中,从右数第2列的两位的和是2,会向高位产生一个进位,而本位为0(2=2+0)。此进位参与第3位的加法运算,这样第3位的和则为3,同样要向高位产生一个进位,而本位则为1(3=2+1)。
下面是两个二进制数的减法运算过程(同样,注意操作数的名称):
image

二进制减法运算规则也和十进制一样,除了被减数某位向高位的借位相当于在本位加2(而十进制中一个借位相当于在本位加10)。在第一个例子中,没有任何借位发生,所以差只是被减数与减数按位简单相减。在第二个例子中,在最右列,由于被减数的该位是0,而减数的该位为1,所以必须向第2位借位,这样第一位的差就是1(2+0―1=1)。在第2位,由于它已被借位,值为0,而减数的第2位为1,所以它还须向第3位借位。如果被减数小于减数,我们就将减数减去被减数,在差的前面加上一个负号。第三个例子说明的就是这种情况,注意减数和被减数的位置被调换了。
最后要演示的是二进制的乘法计算,同样很简单。在二进制乘法中,乘数的数字非0即1。这样,部分乘积就是0或被乘数。下面是乘法的例子:
image

八进制、十六进制以及其他r进制数的算术运算都需要查询对应进制中位与位相加或相乘的结果对应表。一种更简单的办法是将r进制数中一列对应的位转换为十进制数,按十进制规则进行计算,这样我们就可以很方便地使用我们经常习惯使用的十进制计算表,计算完后,再将和以及进位转换回r进制。例1-2是用这种方法计算两个十六进制数59F与E46之和的步骤。
例1-2 十六进制数加法
计算(59F)16+(E46)16:
image

在例子右边等价的十进制的计算过程中,必须运用推理得出对应十六进制中的每一位。例如,在计算右边第一列的F+6时,我们转换成等价的十进制计算15+6=21,然后在转换回十六进制时,我们注意到21=16+5,所以,本位的结果为5,并向高位进1。其他两列的计算方法相同。 ■
总的来说,做两个r进制数的乘法计算时,每一步可以采用十进制的规则进行计算,同时将每一步的中间结果转换为r进制数。例1-3演示的是两个八进制数的乘法。
例1-3 八进制乘法
计算(762)8×(45)8:
image

上图右边演示的是每一对八进制位的心算过程。八进制的0~7的数字和十进制中相对应的数字是一样的。每一对八进制数位的相乘以及加上低位的进位,都可以按十进制的计算方法进行,然后再将这一步的结果转换回八进制,如果结果是两位的八进制数,则高位就是本列的进位,低位就是本列的计算结果。例如,(5×2)8=(12)8,结果中的高位1作为进位加入(5×6)8的计算结果,低位的2就是本列的八进制计算结果。乘数最高位的进位可直接作为乘积中下一位的结果,比如46中的4。 ■
十进制数转换为其他进制数
之前我们采用多项式展开的方法将其他进制的数转换为十进制数。现在我们采用一种通用的过程将十进制数转换为r进制数。如果待转换的数中有小数点,我们要将这个数分成整数部分与小数部分,两个部分的转换要分别进行。通过采用短除法可以将十进制整数转换成r进制数,步骤就是不断用r除要转换的十进制数以及每步产生的商,直至最后的商等于0,每一步所得到的余数就可构成所要转换的结果,其过程可以用例1-4具体说明。
例1-4 十进制整数转换为八进制数
将十进制数153转换为八进制数:
基底为8。首先,用8除153,商为19,余数为1。然后,继续用8除19,商为2,余数为3。最后,用8除2,商为0,余数为2。每一步的余数就可构成我们想要得到的八进制数的位。
image

注意,在例1-4中,余数从最后到第一,按逆序构成转换数的高位到低位,如箭头所指。商不断地被r除直到为0。同样,可以采用这种方法,将十进制数转换为二进制数,如例1-5所示。在这个例子当中,r是2,所以短除法中的除数是2。
例1-5 十进制整数转换为二进制数
转换十进制数41为二进制数:
image

当然,反过来,将二进制数按2的指数多项式展开求和就能得到对应的十进制数。

            (41)10=32+8+1=(101001)2                 ■

将十进制小数转换为r进制形式的方法和整数的转换方法有所不同,称为“连乘法”,也就是不断地用r乘以要转换的十进制小数,每次相乘得到的结果的整数部分构成转换结果的对应的位。这种方法可以用例1-6说明。
例1-6 十进制小数转换为二进制形式
将十进制小数0.6875转换为二进制数:
首先,将0.6875乘以2,结果中有整数与小数,再将新的小数与2相乘,又得到新的整数与小数,这样不断继续,直到小数部分为0或满足精确要求为止。二进制数中的位就由每步得到的整数部分构成,方法如下:
image

注意例子中每步得到的整数按箭头方向排列即可得到转换后的结果。在这个例子中,转换后的小数是有限的,但有时不断连乘并不能使小数部分变为0,这时必须决定需要多少位小数才能满足精确度的要求。由于转换的方法是用r进行连乘,那么将十进制小数转换为八进制形式,就得用8来连乘,如例1-7所示。
例1-7 十进制小数转换为八进制形式
将十进制小数0.513转换为小数位为3位的八进制形式:
image

转换结果中的3位数由每步的整数来构成,我们连乘4次,得到4个整数,注意到最低的一位整数为5,在八进制中按取整法(即类似十进制中的四舍五入),向次低位6进一位,这样就得到:

                (0.513)10=(0.407)8                  ■

如果待转换的数中既有整数部分又有小数部分,就可以将两部分分别转换,最后组合形成结果。比如,采用例1-4和例1-7的结果,我们可以得到:
(153.513)10=(231.407)8

相关文章
|
6月前
|
定位技术 API 网络安全
2026年网站建设需要多少钱?
网站建设费用从千元到数十万元不等,主要取决于开发方式、功能复杂度及设计需求。模板站成本最低,定制开发适中,复杂系统费用最高。建议明确核心需求,选择匹配方案,并关注长期维护成本与隐性费用。
3566 8
|
Python
matplotlib 按指定的时间间隔生成坐标轴
matplotlib 提供了自定义生成时间轴的库,而当我们需要按照自己定义的时间间隔去生成时间轴时,时间轴并没有正常显示,只是按照一个时间跨度更大的方式显示,本文强制 matplotlib 严格按照要求自定义的时间间隔来坐标轴,并对每一行代码做了详细的说明。
7788 0
matplotlib 按指定的时间间隔生成坐标轴
|
Kubernetes 关系型数据库 容器
Kubernetes之路 3 - 解决服务依赖
在容器服务的客户群中,一个经常被问起的问题就是如何处理服务间依赖。本文介绍了常见的解决方法来实现服务的依赖检查,还进一步用示例展示了如何利用init container, liveness/readiness探针等技术实现服务健康检查,依赖检查等等功能。
12604 1
|
5月前
|
人工智能 监控 机器人
2026年阿里云服务器部署OpenClaw(Clawdbot) + 微信接入保姆级全攻略
在AI自动化办公与社交协同深度融合的2026年,OpenClaw(原Clawdbot,曾用名Moltbot)作为阿里云生态下的开源轻量级AI自动化代理工具,凭借“需求解析-任务规划-工具调用-结果反馈”的完整闭环能力,成为个人办公提效、轻量团队协同与私域服务升级的核心选择。其区别于传统聊天机器人,可直接完成文档生成、日程管理、网页抓取、私域客户响应等实操任务,真正实现“AI员工”式的自动化赋能。
1858 4
|
数据采集 NoSQL 调度
当生成器遇上异步IO:Python并发编程的十大实战兵法
本文通过十大实战场景,详解Python中生成器与异步IO的高效结合。从协程演进、背压控制到分布式锁、性能剖析,全面展示如何利用asyncio与生成器构建高并发应用,助你掌握非阻塞编程核心技巧,提升I/O密集型程序性能。
434 0
|
存储 小程序 Java
【小程序分包】小程序包大于2M,来这教你分包啊
本文介绍了如何通过分包解决uniapp小程序包体积过大的问题。由于版本升级导致包体积超过2M,即使压缩静态资源也无法满足发布要求。文章详细讲解了分包的原因、步骤及注意事项,并提供了实操示例,帮助读者理解并实现小程序分包,从而减小主包大小
1683 2
【小程序分包】小程序包大于2M,来这教你分包啊
|
机器学习/深度学习 运维 TensorFlow
使用Python实现深度学习模型:智能交通管控与智慧城市
【7月更文挑战第27天】 使用Python实现深度学习模型:智能交通管控与智慧城市
559 4
使用Python实现深度学习模型:智能交通管控与智慧城市
ly~
|
消息中间件 存储 数据库连接
RocketMQ 消息的重试机制是怎样的?
RocketMQ的消息重试机制确保消息消费失败时能自动重试,直至成功。默认重试16次,时间间隔逐次翻倍,从10秒至数分钟不等。重试在同组内不同消费者间进行,由异常抛出或特定状态返回触发。支持自定义重试次数与时间间隔,建议合理配置避免无限重试,保障系统稳定性和性能。
ly~
4535 2
|
Linux API 图形学
OpenGL生态中的GL, GLU, GLUT, GLX, GLEW, GLEE和GLEXT详解
该文介绍了OpenGL生态系统中的关键组件,包括GL(基础绘图API)、GLU(提供辅助函数)、GLUT(窗口管理和事件处理)、GLX(X Window系统上的OpenGL扩展)、GLEW和GLEE(动态查询和封装OpenGL扩展)以及GLEXT(OpenGL扩展集合)。这些库和工具协同工作,帮助开发者构建跨平台的图形应用程序,提升兼容性与功能。理解它们的作用对优化OpenGL编程至关重要。