汇编/C语言中的逻辑/算数左移/右移操作你真的懂吗

算数左移,逻辑左移,算数右移,逻辑右移有什么不同?

一、算术左移=逻辑左移

说明:算术左移和逻辑左移一样都是右边补0: 比如 00101011

  • 算术左移一位:01010110
  • 逻辑左移一位:01010110
    (对于二进制的数值来说左移n位等于原来的数值乘以2的n次方
    比如00011010十进制是26,左移两位后是01101000转成十进制是104恰好是26的4倍。)
    :这种倍数关系只适用于左移后被舍弃的高位不含1的情况,否则会溢出。
二、算术右移,逻辑右移

说明

  • 逻辑右移很简单,只要将二进制数整体右移,左边补0即可,如10101101逻辑右移一位为01010110
  • 算术右移符号位要一起移动,并且在左边补上符号位,也就是如果符号位是1就补1符号位是0就补0 比如:11100算术右移一位为11110(符号位1跟着一起移动并且左边补了1)
    (对于二进制的数值来说右移n位等于原来的数值除以2的n次方
    比如10110100十进制是76(需要先将这个补码转换成原码之后再转换成十进制),右移两位后是11101101转成十进制是19恰好是76的1/4倍。)
三、总结
  • 算术左移和算术右移主要用来进行有符号数的倍增、减半;
  • 逻辑左移和逻辑右移主要用来进行无符号数的倍增、减半。

汇编语言中的左移右移规则是什么样的?

说明:移位指令包括了 算术移位指令、逻辑移位指令、循环移位指令。

一、算术移位指令
1、算术左移指令SAL

功能:左移一次,最低位补0,最高位送入CF标志位,如图:
SAL
意义:左移n次,等于x2的n次幂。所以可用于有符号操作数做x2的n次幂运算。

2、算术右移指令SAR

功能:右移一次,最高位保持不变,最低位送入CF标志位,如图:
SAR
意义:右移n次,等于/2的n次幂。所以可用于有符号操作数做/2的n次幂运算。

二、逻辑移位指令
1、逻辑左移SHL

功能:同SAL,如图:
SHL
意义:同SAL

2.逻辑右移SHR

功能:右移一次,最高位补0.区别!最低位送入CF标志位。如图:
SHR
意义:用于实现无符号数/2的n次幂操作。

三.循环移位指令
1.循环左移指令ROL

功能:左移一次,左移前的最高位送入最低位以及CF.如图:
ROL

2.循环右移指令ROR

功能:右移一次,右移前的最低位送入最高位以及CF.如图:
ROR

3、带进位的循环左移RCL

功能:左移一次,左移前的最高位送入CF,CF的内容送入最低位.如图:
RCL

4.带进位的循环右移RCR

功能:右移一次,右移前的最低位送入CF,CF的内容送入最高位.如图:
RCR


C语言中的左移右移规则是什么样的?

一、验证参见下面链接资料

原链接:

二、总结
  • 左移就是: 丢弃最高位,0补最低位
  • 右移:对于有符号整数来说,比如int类型,右移会保持符号位不变
    (在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变,相当于汇编的算术右移)