当你通过搜索逻辑,算术移位运算的时候,一直寻找资料,只不过可能你没有找到满意的回答,看到这,你大概率可以结束你的搜索过程了。

这里先说一句很重要的话:

  • 正数的原码,反码,补码三者相同。
  • 负数的反码就是该负数的绝对值(正数)的原码的所有位取反,负数的补码就是反码加一。
    如果你想了解反码,原码,补码的定义还有补码为什么要+1,为什么补码比原码多表示一个数的话,你可以看我的另一篇文章《原码、反码、补码的知识总结》,

1.算术左移-逻辑左移
他们都遵循:高位丢弃,低位补零。
对于一个数字:00110011
算术左移一位的话:01100110
逻辑左移一位的话:01100110

对于他们的数值变化,左移n位,他们的数值就变为原来的2^n倍,比如左移一位,移位后的数值变为原来的2倍。
比如:十进制的52,在二进制的表达是:00110011,算术或逻辑左移一位后变为:01100110,转化为十进制就是102。102/51=2,移位后的数值变为原来的2倍。
不过,这种数值变化关系只是适用于移位后被舍弃的所有高位里面没有1,不然的话,移位的过程就会有溢出。(以上的二进制表示的都是以原码形式的。)

2.算术右移-逻辑右移
对于有符号的数,一般编译器都是对其进行算术右移,而对无符号数,都是采用逻辑右移,为什么呢?无符号的是并没有符号位,怎么移动都是补零,算术右移没有意义。
例子1:11001100、01100110

逻辑右移:
对例子都进行逻辑右移一位,得01100110、00110011。只需要将数字往右移动一位,左边补上0就可以了。

算术右移
算术右移要保持符号位不变,左边所补上的数和符号位一样。对于有符号的数:最高位就是它的符号位,0表示正,1表示负。如果是对正数的右移的话,由于正数的原码和补码一样,所以你可以直接对原码进行移位操作,但是,如果你是对负数进行移位操作的话,由于一般负数都是以补码作为储存形式的,所以对负数的移位操作要对补码进行,而不是原码。

例子2:

数值 原码 补码1(原码除符号位取反后+1)
-4 1000 0100 1111 1100
向右移一位后,补码变为 1111 1110
补码2 原码(补码减1,除符号位,其他取反) 数值
1111 1110 1000 0010 -2

可见:对例子1和2进行算术右移一位,得11100110,00110011(符号位跟着一起移动并且左边补上了符号位。)。同样的,对于右移的数值变化,相当于除以2^n,n是移位的次数。如果移位的是一个奇数的话,一个奇数除以二,会出现小数,那么这时候移位的数值取小于这个带小数的数字的最大整数。
比如: 51/2 = 25.5,取小于25.5的最大正数就是25。

3.右移一位还有除二的区别。

通过上面你可能会把除以2和右移一位等价起来,其实两者的关系有点复杂,两者只是在某一些情况下才会相等,下面我开始详细的讲解一下他们两者的关系,如果赶时间的话,可以直接看我最后的总结;

大家可以自己编写程序,看看右移一位和除以二的数字有什么区别,为了避免遗漏数据,我把数据分成了 :正偶数 正奇数 零 负偶数 负奇数 。

这是我的草稿纸,在思维导图上分析了一下,懒得敲代码了:

下面是总结:

  1. n为非负数时,>> 1和 / 2的结果是一样的
  2. n为负数且还是偶数时,>> 1和/ 2的结果是一样的
  3. n为负数且还是奇数时,>> 1和/ 2的结果是不一样的

原因是奇数除二会发生截断现象。而>> 1和/ 2在n为负奇数时截断的反向不一样。
具体的说就是:
1.除以2的算术逻辑:类似于强制转化,比如-3 / 2 = -(int)1.5 = -1,这里就是把绝对值变小了,但是加了个负号,结果就变大了。
2.对于移位,由于负数就是采用补码储存的,而补码和原码是根据模弄出来的,具体看我的《原码、反码、补码的知识总结》,补码移位后舍去小数点,相当于补码变大,原码变小,-3 >> 1 = (1101) >> 1 = (1010) = -2,所以,负数的奇数除以2会比向右移动一位大1.

4.算术溢出:
对于算术或者右移,没有溢出的情况;但是对于左移,是有溢出的情况的;
设一个八位数的二进制为X0 X1 X…X7;
对于原码,X0 = 1,那么左移的话,会有溢出的情况;
对于反码,X0 = 0 ,那么左移的话,会有溢出的情况;
也就是说对于原码,移出去的高位有1的话,那么就会有溢出,对于反码,移出去的高位有有0的话, 那么就有溢出。
对于补码,如果符号位和数据最高位相同的话,那么就不会溢出,如果符号位和数据有不同的话,那么会有溢出的情况。
其实向左移一位,可以看成是加上相同的数,所以向左移位可以转化了二进制的加法运算,接下来我用双高位判别法来讲解一下溢出;
Cs:它表征最高位(符号位)的进位情况,若符号位有进位,则Cs=1,否则,Cs=0。
Cp:它表征数值部分的最高位的进位情况,若最高数值发生进位,则Cp=1,否则Cp=0。

比如:

所以可以根据,Cs和Cp的组合判断,会不会有溢出:

由于Cs和Cp的组合与符号位和数值最高位的组合一样,有相同的结果,所以可以下结论:
当数据的最高位和符号位不同时,此时进行算术左移会导致符号的变化,从而超出该数据的设定的范围大小,从而溢出,如果相同,则不会溢出。

参考资料:
1.百度百科——算术左移位:
https://baike.baidu.com/item/算数左移位/22225819?fr=aladdin
2.CSDN博客《右移一位和除二的区别》:
https://blog.csdn.net/FlushHip/article/details/82495034
3.百度百科——补码:
https://baike.baidu.com/item/补码/6854613?fr=aladdin
4.CSDN博客《算术左移后溢出判断》:
https://blog.csdn.net/qq_35661481/article/details/78991712
5.bilibili——《无符号二进制数的算术运算和逻辑运算及运算的溢出》
https://www.bilibili.com/video/BV1vp4y1Q7Zp?from=search&seid=3267128644212277897

算术左、右移位与逻辑左、右移位,右移一位和除二的区别、算术溢出相关推荐

  1. 计算机中右移一位和除以二的区别

    二分查找中的中位数 在二分查找算法中,我们经常会写类似int mid = (left + right) / 2的操作,考虑周全一点的会写成int mid = left + (right - left) ...

  2. 位运算,左移位,右移位

    位运算: C语言既具有高级语言的特点,又具有低级语言的特点,如支持位运算就是其具体体现.这是因为,C语言最初是为了取代汇编语言设计系统软件而设计的,因此C语言必须支持位运算等汇编操作. 位运算就是对字 ...

  3. SystemVerilogVerilog 算术(右左)移和逻辑(右左)移的区别

    在编写SystemVerilog&Verilog的过程中,我们在涉及到左移和右移的操作运算时需要注意算术右移和逻辑右移的区别,并且需要对此非常小心,否则容易造成错误!!! 算术右移:要考虑符号 ...

  4. 位操作符:位与、|位或、^异或、~求反、左移位、带符号右移位、无符号右移位...

    . 操作符 名称 实例(例中使用字节) 描述 & 位与 10101110 & 10010010 得到10000010 两个相应位上比特如果都为1,则执行 与 操作会得到1 | 位或 1 ...

  5. 算术右移 java_Java 中 算术右移和逻辑右移有什么区别?

    算术移位:>>,有符号的移位操作,右移之后的空位用符号位补充,如果是 正数用 0 补充,负数用1补充. 例1: -4>>1 -4的原码 10000000 00000000 00 ...

  6. java右移位_java中的左移 右移

    1. 左移运算符 左移运算符< 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规则只记住一点:丢弃最高位,0补最低位 如果 ...

  7. 算术左移、算术右移、逻辑右移

    首先说明一点,本文所有的操作都是针对存储在计算机中中二进制的操作,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的. 算术左移(<<):有符号的移位操作:该操作时将运算数的二进 ...

  8. 算数运算,逻辑运算,算术右移,逻辑右移

    比如一个有符号位的8位二进制数11001101,逻辑右移就不管符号位,如果移一位就变成01100110.算术右移要管符号位,右移一位变成10100110. 逻辑左移=算数左移,右边统一添0 逻辑右移, ...

  9. 【题目】一根长度为M厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为每秒1厘米。当两只蚂蚁对撞时,二者同时掉头(掉头时间忽略不计)。给出每只蚂蚁的初始位置和朝向,计算T秒后每只蚂蚁的位置

    文件名:[作业] 作者:〈漆黑〉 描述:〈 一根长度为M厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为每秒1厘米.当两只蚂蚁对撞时,二者同时掉头(掉头时间忽略不计).给出每只蚂蚁的初始 ...

最新文章

  1. 独家 | 2种数据科学编程中的思维模式,了解一下(附代码)
  2. 大话IT职场之办公室环境重要吗?
  3. 《深度学习的数学》笔记【各种概念】
  4. 苹果和虫子问题C++
  5. MFC制作简易音乐播放器
  6. DTP动态协商——trunk配置、如何关闭域名解析、光接口无法up的原因详解(附图)
  7. ofstream 的中文目录问题
  8. 易买网(注册Ajax讲解)
  9. UDS诊断基础知识简介-ISO14229
  10. navicat for mysql 亲测好用的 中文破解版
  11. 软件测试工程师 岗位分析
  12. 39个大数据可视化工具
  13. Win10压缩卷提示磁盘空间不足
  14. 分数加减乘除混合运算带答案_100道题,分数加减法混合运算,要答案
  15. 干货!让人一见钟情的网站header设计攻略
  16. 异地二维码收款被风控的问题解决方法
  17. 计算机网络第七版4-46题答案,计算机软考网络管理员考试题及答案(44-46)
  18. 如何用u盘制作成linux系统的安装盘
  19. 制作一个简单的轮播图
  20. JavaScript经典代码总结

热门文章

  1. 数据库上机实验一、二
  2. 全美“50大好差事” 软件工程师排名第一
  3. 苹果零售店十大秘诀:禁止纠正顾客发音错误
  4. 让我们的爱洒满孩子们的心
  5. Ubuntu 复制文件报设备空间不足解决办法
  6. J语言初步,绝妙的符号系统,神的计算器
  7. Devoxx法国2012天3
  8. Opencv中,imag=cv2.cvtColor(imag,cv2.COLOR_BGR2GRAY) 报错:error:!_src.empty() in function ‘cv::cvtColor‘
  9. OpenCV中的图像基本操作--B站视频教程笔记(四)
  10. 华为鸿蒙朱丹丹,周一围心疼老婆?朱丹二胎产后憔悴臃肿却忙复出:这一年太痛苦...