《逻辑与计算机设计基础(原书第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

相关文章
|
9月前
|
定位技术 API 网络安全
2026年网站建设需要多少钱?
网站建设费用从千元到数十万元不等,主要取决于开发方式、功能复杂度及设计需求。模板站成本最低,定制开发适中,复杂系统费用最高。建议明确核心需求,选择匹配方案,并关注长期维护成本与隐性费用。
4236 8
|
Python
matplotlib 按指定的时间间隔生成坐标轴
matplotlib 提供了自定义生成时间轴的库,而当我们需要按照自己定义的时间间隔去生成时间轴时,时间轴并没有正常显示,只是按照一个时间跨度更大的方式显示,本文强制 matplotlib 严格按照要求自定义的时间间隔来坐标轴,并对每一行代码做了详细的说明。
7911 0
matplotlib 按指定的时间间隔生成坐标轴
|
8月前
|
人工智能 监控 机器人
2026年阿里云服务器部署OpenClaw(Clawdbot) + 微信接入保姆级全攻略
在AI自动化办公与社交协同深度融合的2026年,OpenClaw(原Clawdbot,曾用名Moltbot)作为阿里云生态下的开源轻量级AI自动化代理工具,凭借“需求解析-任务规划-工具调用-结果反馈”的完整闭环能力,成为个人办公提效、轻量团队协同与私域服务升级的核心选择。其区别于传统聊天机器人,可直接完成文档生成、日程管理、网页抓取、私域客户响应等实操任务,真正实现“AI员工”式的自动化赋能。
2068 4
|
5月前
|
人工智能 机器人 测试技术
用 Bub 和飞书搭一个更懂群聊上下文的小机器人
手把手教你搭建 Bub:一个懂群聊上下文、无“班味”的轻量化 AI 助理。
555 1
用 Bub 和飞书搭一个更懂群聊上下文的小机器人
|
8月前
|
缓存 供应链 数据可视化
2026 年主流数据可视化工具核心推荐
2026年,瓴羊Quick BI以系统化可视化能力脱颖而出:支持50+专业图表、精细视觉配置、联动钻取/下钻等深度交互、多端自适应输出,并提供零售、制造、金融等行业模板,助力企业高效实现数据洞察与决策落地。(239字)
|
SQL 关系型数据库 MySQL
PHP与MySQL的高效交互:从基础到实践####
本文深入探讨了PHP与MySQL数据库之间的高效交互技术,涵盖了从基础连接到高级查询优化的全过程。不同于传统的摘要概述,这里我们直接以一段精简代码示例作为引子,展示如何在PHP中实现与MySQL的快速连接与简单查询,随后文章将围绕这一核心,逐步展开详细讲解,旨在为读者提供一个从入门到精通的实战指南。 ```php <?php // 数据库配置信息 $servername = "localhost"; $username = "root"; $password = "password"; $dbname = "test_db"; // 创建连接 $conn = new mysqli($se
547 31
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课18 通过pg_bulkload适配pfs实现批量导入提速
本文介绍了如何修改 `pg_bulkload` 工具以适配 PolarDB 的 PFS(Polar File System),从而加速批量导入数据。实验环境依赖于 Docker 容器中的 loop 设备模拟共享存储。通过对 `writer_direct.c` 文件的修改,替换了一些标准文件操作接口为 PFS 对应接口,实现了对 PolarDB 15 版本的支持。测试结果显示,使用 `pg_bulkload` 导入 1000 万条数据的速度是 COPY 命令的三倍多。此外,文章还提供了详细的步骤和代码示例,帮助读者理解和实践这一过程。
925 0
|
Cloud Native 安全 Serverless
Serverless 应用引擎 SAE:让应用管理如此简单
本次课程由阿里云智能集团高级技术专家赵庆杰分享,主题为“Serverless 应用引擎 SAE:让应用管理如此简单”。课程涵盖四个主要部分:降本增效、功能场景、关键技术与客户案例。SAE 引擎通过按量付费、弹性伸缩等特性简化应用管理,帮助企业将更多精力投入到 AI 应用和业务价值上。SAE 提供了低门槛微服务架构转型、应用快速上云、一键启停环境、高可用方案及 CI/CD 解决方案等功能。此外,还介绍了高等教育出版社使用 SAE 进行云原生改造的案例,展示了其在降本增效、提升研发效能和安全性方面的显著成果。
595 9
|
供应链 搜索推荐 API
1688榜单商品详细信息API接口的开发、应用与收益
1688作为全球知名B2B电商平台,为企业提供丰富的商品信息和交易机会。随着电商发展,企业对数据需求增长,高效获取与利用数据成为提升竞争力的关键。1688榜单商品详细信息API接口应运而生,帮助企业批量获取商品详情,应用于信息采集、校验、同步与数据分析等领域,显著提高运营效率、优化库存管理、提升个性化推荐精准度,并助力制定更有效的市场策略,降低采购成本,最终提升客户满意度,推动企业可持续发展。
476 3
|
存储 小程序 Java
【小程序分包】小程序包大于2M,来这教你分包啊
本文介绍了如何通过分包解决uniapp小程序包体积过大的问题。由于版本升级导致包体积超过2M,即使压缩静态资源也无法满足发布要求。文章详细讲解了分包的原因、步骤及注意事项,并提供了实操示例,帮助读者理解并实现小程序分包,从而减小主包大小
1787 2
【小程序分包】小程序包大于2M,来这教你分包啊