逻辑左移、逻辑右移、算术左移、算术右移区别

更新于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。
可见两种移位结果不同。

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

  • 14
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值