我是靠谱客的博主 魁梧大侠,最近开发中收集的这篇文章主要介绍逻辑左移、逻辑右移、算术左移、算术右移区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

更新于20200715:
逻辑移位和算术移位不同,否则汇编指令就保留一个就行了,干嘛还保留2个呢?
因此:
逻辑移位主要用于无符号数的移位,左移和右移均是移丢一位+空位补0
算术移位主要用于有符号数的移位运算,移位操作时,无论是正数还是负数,无论是原码,反码,补码,均不能改变符号位的位置和值
算术移位分正数的原码,反码,补码的左移和右移,负数的原码,反码,补码的左移和右移
其中正数的原码,反码,补码完全一样,所以左移和右移时,符号位不变,数值的最高位或最低位移丢,空出的位补0;
负数的原码,左移:符号位不变,数值最高位移丢,最低位补0;右移:符号位不变,数值最低位移丢,最高位补0,
负数的反码,左移:符号位不变,数值最高位移丢,最低位补1;右移:符号位不变,数值最低位移丢,最高位补1,
负数的补码,左移:符号位不变,数值最高位移丢,最低位补0;右移:符号位不变,数值最低位移丢,最高位补1。

第一种观点:
逻辑左移=算术左移,右边统一填0 ,最高位移入cf

逻辑右移,左边统一添0 ,最低位移入cf

特殊:算数右移,左边添加的数和符号位有关,最低位移入cf

e.g:1010101010,其中[]是添加的位

逻辑左移一位:010101010[0]

算数左移一位:010101010[0]

逻辑右移一位:[0]101010101

算数右移一位:[1]101010101

算术右移的2种实现方式(结果是相同的):
1.符号位不变,数值位右移,最低位移入cf,最高位数值位填符号位的值(1或0);
2.符号位和数值位无差别右移,最低位移入cf,最高位填符号位的值(1或0)。

第二种观点:

算术移位时符号位(最高位)不变
左移时最高数值位移进cf,最低位填0;
右移时最低数值位移进cf,最高数值位填符号位的值(1或0);

逻辑移位时没有符号位:
左移时最高位移进cf,最低位填0;
右移时最低位移进cf,最高位填0;
例如

10101110逻辑右移一位得01010111逻辑左移一位得01011100。
若将其视为补码则算术左移一位得11011100算术右移一位得11010111。
可见两种移位结果不同。

以上属于转载别人观点,个人暂更倾向于第二种观点

最后

以上就是魁梧大侠为你收集整理的逻辑左移、逻辑右移、算术左移、算术右移区别的全部内容,希望文章能够帮你解决逻辑左移、逻辑右移、算术左移、算术右移区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部