《计算机系统:核心概念及软硬件实现(原书第4版)》——3.3 二进制运算

简介:

本节书摘来自华章计算机《计算机系统:核心概念及软硬件实现(原书第4版)》一书中的第3章,第3.3节,作者:[美] J. 斯坦利·沃法德(J. Stanley Warford)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.3 二进制运算

因为计算机中所有信息都是以二进制存储的,所以CPU就用二进制运算来处理这些信息。前面章节提到了NOT、ADD和NEG这些二进制运算:NOT是逻辑运算符,ADD和NEG是算术运算符。本节我们再讲一些其他的在计算机CPU中有用的逻辑和算术运算符。
3.3.1逻辑运算符
我们熟悉逻辑运算AND和OR。另一个逻辑运算符是异或,写作XOR。若p为真,或者q为真,但不同时为真,那么p和q的异或逻辑值为真。即,p一定真异于q,或者q必须真异于p。
二进制数字一个有趣的属性是可以把它们作为逻辑值来解读。在ISA3层,位为1表示真,位为0表示假。图3-15展示了AND、OR和XOR运算符在ISA3层的真值表。
image

在HOL6层,AND和OR对值为真或假的布尔表达式运算,用在if语句和循环中来测试控制语句执行的条件。下面的C++语句是AND运算符的一个例子
image

图3-16是AND、OR和XOR在HOL6层的真值表,它和图3-15是一样的,ISA3层的1对应HOL6层的true(真),ISA3层的0对应HOL6层的false(假)。

image

由于不涉及进位,所以逻辑运算比加法更容易执行。对序列中的对应位进行遂位运算。逻辑运算对进位位和溢出位都没有影响。
例3.19一些6位单元的例子是
image

注意,如果把1与1做AND运算,结果是1,没有进位。 □
每个AND、OR和XOR运算用两组位来产生结果,不过NEG运算仅对一组位进行,因此称为一元运算(unary operation)。
3.3.2寄存器传送语言
寄存器传送语言(RTL)的目的是精确指定硬件操作的结果。如果学习过逻辑学,你会熟悉RTL符号。图3-17展示了RTL符号。


image


在逻辑学中,AND和OR运算称为合取(conjunction)和析取(disjunction),NOT运算符称为否定(negation)。蕴含(implies)运算符可以翻译为英语“if/then”(中文“如果/那么”)。传递(transfer)运算符是与C++中赋值运算符=等效的硬件。运算符左边的内存单元获得运算符右边的量。位索引运算符把内存单元当做数组,最左边的位是索引0,与C++索引数组元素一样。当形式化描述不够时,可以用非形式化的语言描述,用大括号括起来。
有两种分隔符:一个是顺序分隔符(sequential separator)(分号),用来分隔一个接一个发生的两个动作;另一个是并发分隔符(concurrent separator)(逗号)用来分隔同时发生的两个动作。
例3.20在例3.19的第3个计算中,假设第一个6位单元用a表示,第二个6位单元用b表示,结果为c,那么XOR运算的RTL表述是
c←a⊕b; N←c<0, Z←c=0
首先,c获得a和b的异或,这个动作完成后,下面这两个动作同时发生:N获得一个布尔值,Z获得一个布尔值。当c<0时,布尔表达式c<0为1,否则为0。     □
3.3.3算术运算符
另外还有两个一元运算符:ASL表示算术左移(arithmetic shift left)和ASR表示算术右移(arithmetic shift right)。如同ASL这个名字暗示的,单元中每位往左移动一个位置,最左边的位移动到进位位,而最右边的位得到0。图3-18展示了一个6位单元的ASL运算的动作。

image


例3.21下面是3个算术左移的例子。
ASL 11 1100=11 1000, N=1, Z=0, V=0, C=1
ASL 00 0011=00 0110, N=0, Z=0, V=0, C=0
ASL 01 0110=10 1100, N=1, Z=0, V=1, C=0     □
这个运算称为算术移位,因为当这些位用作整数表示时,它的结果类似于算术操作。假设用无符号二进制表示,前面例子中3个整数在移动前是
60 3 22 (dec,unsigned)
移动后成为
56 6 44 (dec,unsigned)
ASL的结果是原数的2倍。因为120超出6位单元能表示的整数范围,所以ASL不能把60翻倍。当把二进制序列看作无符号整数时,如果移动后进位位是1,则发生溢出。
在十进制中,左移产生同样的结果,只是整数被乘以10而不是2。例如,对356进行十进制的ASL会得到3560,它是原数值的10倍。
如果把数解释为补码表示会是什么情况呢?那么移动前3个整数是
-4322(dec,signed)
移动后成为
-86-20(dec,signed)
同样,尽管是负数,ASL的结果仍然是原数的2倍。这次,ASL不能把22翻倍,假定用补码表示,44超出了范围。这个溢出情况使得V位被设置为1。这个情形与加法运算中C位检测到无符号值溢出相似,需要用V位来检测有符号值的溢出。
对6位单元r进行算术左移的RTL表述为
C←r<0>, r<0..4> ←r<1..5>, r<5>←0;
N← r<0, Z←r = 0, V←{溢出}
同时,C获得r最左边的位,r最左边的5位直接获得它们紧邻着的右边位的值,最右边一位获得0。移位之后,根据r的新值设置状态位N、Z和V。区分分号和逗号是很重要的:分号隔开两个事件,每个事件有3个部分;在每个部分内,逗号隔开同时发生的事件。大括号非形式化地表示当把值当作有符号整数时,根据结果是否溢出对V位进行设置。
在ASR运算中,组中每个位往右移动一个位置,最低有效位移到进位位,最高有效位保持不变。图3-19展示了一个6位单元的ASR运算的动作。ASR运算不会影响V位。

image


例3.22下面是4个算术右移的例子。
ASR 01 0100=00 1010,N=0, Z=0, C=0
ASR 01 0111=00 1011,N=0, Z=0, C=1
ASR 11 0010=11 1001,N=1, Z=0, C=0
ASR 11 0101=11 1010,N=1, Z=0, C=1     □
ASR运算是特意为补码表示设计的,因为符号位保持不变,负数仍然是负数,正数仍然是正数。
往左移1位是原数乘以2,反之往右移1位是原数除以2。在前面例子中,移动前4个整数为
2023-14-11(dec,signed)
移动后是
1011-7-6(dec,signed)
偶数正好可以被2整除,因此ASR对它们的结果没什么疑问。当奇数除以2时,结果总是向下取整。例如,23÷2=11.5,11.5向下取整为11,同样,-11÷2=-5.5,-5.5向下取整为-6。注意,因为在数轴上-6在-5.5左边,因此它小于-5.5。
3.3.4循环移位运算符
和算术运算符相比,循环移位运算符不会把二进制序列看作整数,因此循环移位运算不会影响N、Z和V位,而只会影响C位。有两种循环移位运算符:表示为ROL的循环左移和表示为ROR循环右移。图3-20展示了6位单元的循环移位运算符的动作。循环左移类似于算术左移,在循环左移中C位会循环移到单元的最右边位,而在算数右移中是0。循环右移是在相反的方向做同样的事情。

image


6位单元循环左移的RTL表述是
C←r〈0〉, r〈0..4〉 ←r〈1..5〉, r〈5〉←c;
例3.23下面是4个循环移位运算的例子。
C=1,ROL 01 1101=11 1011,C=0
C=0,ROL 01 1101=11 1010,C=0
C=1,ROR 01 1101=10 1110,C=1
C=0,ROR 01 1101=00 1110,C=1
左边是循环移位前的C值,而右边是循环移位后的C值。  □

相关文章
|
存储 Java
Springboot 验证码生成和校验,图片格式和base64编码串
Springboot 验证码生成和校验,图片格式和base64编码串
1413 0
Springboot 验证码生成和校验,图片格式和base64编码串
|
2月前
|
机器学习/深度学习 传感器 算法
基于一维卷积神经网络(1D-CNN)的多变量回归预测模型MATLAB完整代码
🌿 往期回顾可以关注主页,点击搜索 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号处理 图像处理 路径规划 元胞自动机 无人机 物理应用 机器学习系列 车间调度系列 滤波跟踪系列 数据分析系列 图像处理系列 ✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:
|
数据采集 存储 监控
数据清洗那些坑,程序员如何“踩雷避坑”?
数据清洗那些坑,程序员如何“踩雷避坑”?
519 102
|
测试技术
用navigator.sendBeacon完成网页埋点异步请求记录用户行为,当网页关闭的时候,依然后完美完成接口请求,不会因为浏览器关闭了被中断请求。
用navigator.sendBeacon完成网页埋点异步请求记录用户行为,当网页关闭的时候,依然后完美完成接口请求,不会因为浏览器关闭了被中断请求。
|
5月前
|
安全 Linux Shell
【Linux进阶】拒绝Permission denied!彻底搞懂chmod与chown文件权限
本文深入解析Linux权限管理核心命令`chmod`与`chown`,教你读懂`ls -l`输出,掌握数字权限(如755、644)的含义与应用场景,理解属主与属组的作用,强调最小权限原则,拒绝滥用`chmod 777`,保障服务器安全。
|
存储 安全 API
Visual Basic中的文件处理:读取与写入技术详解
【4月更文挑战第27天】本文探讨了Visual Basic的文件处理技术,包括VB6和VB.NET中的读写操作。介绍了文件路径、模式,展示了VB6的`Open`、`Input`和`Close`语句及VB.NET的`StreamReader`、`StreamWriter`用法。强调了异常处理和最佳实践,如使用`BinaryReader`/`BinaryWriter`处理二进制文件,流式处理大文件,以及确保路径安全。理解并掌握这些技能对高效、安全的文件操作至关重要。
1093 2
|
机器学习/深度学习 算法 Serverless
神经网络的激活函数(二)
本文介绍了神经网络中的激活函数,特别是tanh和ReLU。tanh函数将输入映射到(-1,1),以0为中心,加快了训练速度,但两侧导数为0可能导致梯度消失。ReLU函数在正区间的导数为1,解决了梯度消失问题,常用于隐藏层。softmax函数用于多分类,将输出转换为概率分布。文章还包含了代码示例,展示了这些函数的图形和导数。
|
存储 机器学习/深度学习 PyTorch
【从零开始学习深度学习】19. Pytorch中如何存储与读取模型:torch.save、torch.load与state_dict对象
【从零开始学习深度学习】19. Pytorch中如何存储与读取模型:torch.save、torch.load与state_dict对象
|
机器学习/深度学习 算法
R语言超参数调优:深入探索网格搜索与随机搜索
【9月更文挑战第2天】网格搜索和随机搜索是R语言中常用的超参数调优方法。网格搜索通过系统地遍历超参数空间来寻找最优解,适用于超参数空间较小的情况;而随机搜索则通过随机采样超参数空间来寻找接近最优的解,适用于超参数空间较大或计算资源有限的情况。在实际应用中,可以根据具体情况选择适合的方法,并结合交叉验证等技术来进一步提高模型性能。
1389 5
|
机器学习/深度学习 算法
神经网络的激活函数(一)
人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN),是一种模仿生物神经网络结构和功能的 计算模型。人脑可以看做是一个生物神经网络,由众多的神经元连接而成。各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号。