算数右移和逻辑右移的区别及逻辑运算的窍门

简介: 算数右移和逻辑右移的区别及逻辑运算的窍门

一、算数右移和逻辑右移的区别


       右移在移后空出来的高位有两情况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

目录
相关文章
|
分布式计算 Java Shell
Spark Shell入门教程(上)
Spark Shell入门教程(上)
1369 0
Spark Shell入门教程(上)
|
存储 文件存储 对象存储
块存储、文件存储和对象存储特点对比
块存储、文件存储和对象存储特点对比
1707 2
|
JavaScript
5. 解决 nativeTags 不被 Vue - Office 插件兼容的问题
5. 解决 nativeTags 不被 Vue - Office 插件兼容的问题
418 0
|
开发工具 Android开发 开发者
Android开发环境搭建
如何搭建Android开发环境,包括下载和安装Android Studio、配置SDK、创建新的Android工程项目等。
659 0
Android开发环境搭建
中缀表达式转后缀表达式(逆波兰式)
中缀表达式转后缀表达式(逆波兰式)
1669 0
|
编译器 测试技术 调度
C++ 中 template<class T>和template<typename T>的区别
C++ 中 template<class T>和template<typename T>的区别
916 0
|
机器学习/深度学习 算法 数据挖掘
survey和surveyCV:如何用R语言进行复杂抽样设计、权重计算和10折交叉验证?
survey和surveyCV:如何用R语言进行复杂抽样设计、权重计算和10折交叉验证?
1114 1
|
存储
原码,补码的乘法运算
原码,补码的乘法运算
1061 0
|
网络协议 算法 网络性能优化
探索HTTP/3.0:下一代网络协议的前沿
探索HTTP/3.0:下一代网络协议的前沿
1273 0
|
消息中间件 网络协议 Java
RabbitMQ消息队列基础详解与安装实例
RabbitMQ消息队列基础详解与安装实例
516 0