算数右移和逻辑右移的区别在了解完补数后,我们重新考虑一下右移这个议题,右移在移位后空出来的最高位有两种情况 0 和 1 。当二进制数的值表示图形模式而非数值时,移位后需要在最高位补0,类似于霓虹灯向右平移的效果,这就被称为逻辑右移 。

文章插图
逻辑右移示意图
将二进制数作为带符号的数值进行右移运算时,移位后需要在最高位填充移位前符号位的值( 0 或 1) 。这就被称为
算数右移 。如果数值使用补数表示的负数值,那么右移后在空出来的最高位补 1,就可以正确的表示1/2,1/4,1/8等的数值运算 。如果是正数,那么直接在空出来的位置补 0 即可 。下面来看一个右移的例子 。将 -4 右移两位,来各自看一下移位示意图

文章插图
逻辑右移和算数右移示意图
如上图所示,在逻辑右移的情况下, -4 右移两位会变成
63, 显然不是它的 1/4,所以不能使用逻辑右移,那么算数右移的情况下,右移两位会变为-1,显然是它的 1/4,故而采用算数右移 。那么我们可以得出来一个结论:左移时,无论是图形还是数值,移位后,只需要将低位补 0 即可;右移时,需要根据情况判断是逻辑右移还是算数右移 。
下面介绍一下符号扩展:将数据进行符号扩展是为了产生一个位数加倍、但数值大小不变的结果,以满足有些指令对操作数位数的要求,例如倍长于除数的被除数,再如将数据位数加长以减少计算过程中的误差 。
以8位二进制为例,符号扩展就是指在保持值不变的前提下将其转换成为16位和32位的二进制数 。将
0111 1111这个正的 8位二进制数转换成为 16位二进制数时,很容易就能够得出0000 0000 0111 1111这个正确的结果,但是像1111 1111这样的补数来表示的数值,该如何处理?直接将其表示成为1111 1111 1111 1111就可以了 。也就是说,不管正数还是补数表示的负数,只需要将 0 和 1 填充高位即可 。逻辑运算的窍门掌握逻辑和运算的区别是:将二进制数表示的信息作为四则运算的数值来处理就是
算数,像图形那样,将数值处理为单纯的0和1的罗列就是逻辑计算机能够处理的运算,大体可分为逻辑运算和算数运算,
算数运算指的是加减乘除四则运算;逻辑运算指的是对二进制各个数位的 0 和 1分别进行处理的运算,包括逻辑非(NOT运算)、逻辑与(AND运算)、逻辑或(OR运算)和逻辑异或(XOR运算)四种 。•
逻辑非指的是将 0 变成 1,1 变成 0 的取反操作•逻辑与指的是"两个都是 1 时,运算结果才是 1,其他情况下是 0"•逻辑或指的是"至少有一方是 1 时,运算结果为 1,其他情况下运算结果都是 0"•逻辑异或指的是 "其中一方是 1,另一方是 0时运算结果才是 1,其他情况下是 0"
文章插图
与或非异或真值表
掌握逻辑运算的窍门,就是要摒弃二进制数表示数值这一个想法 。大家不要把二进制数表示的值当作数值,应该把它看成是 开关上的
ON/OFF 。文章参考:
《程序是怎样跑起来的》
< END >
推荐阅读
- 用户的违规行为通过什么排查发现 什么叫违反用户行为规范
- 微服务架构,多“微”才合适?
- Python定义全局变量的几种用法
- 你的网络信息是怎么泄露的?这四个陷阱了解下
- 基于token机制鉴权架构
- MySQL权限处理的一个小bug
- 黑客必学的awk文件操作命令工具
- 茶叶的选购注意看形闻香尝味观色
- 昆仑雪菊胎菊冲泡方法
- Mysql:替换某个字段中的部分字符串——replace函数
