前言
首先需要明确几个概念:
1.计算机操作的都是补码。
2.正数的补码和原码相同,负数的补码等于原码取反后+1.
3.需要先确定位数(如8位、16位、32位),因为有可能会出现溢出的情况。
逻辑左移
逻辑左移是不考虑符号的左移操作。它用于对无符号整数进行左移。
在逻辑左移中,所有位都向左移动,不考虑符号位。
逻辑左移将左边空出的位用0填充。
例如原始:00000010 ----- 2
左移二位:00000100 ----- 4
算术左移
算术左移是带符号左移操作。它用于对带符号整数进行左移,保持数的符号位不变。
在算术左移中,最高位(符号位)的值会在左移时保持不变。左移后的空位用零填充。
在不溢出的情况下相当于乘以2。
算术左移与逻辑左移相似,但对于有符号整数,它保留了符号位。
例如原始:11111110 ----- -2
左移一位:11111100 ----- -4
注意:在不溢出的前提下(如8位的范围是-128-127),算术右移和逻辑右移的结果一样。
逻辑右移
逻辑右移是不考虑符号位的右移操作。它用于对无符号整数进行右移。
在逻辑右移中,所有位都向右移动,不考虑符号位。
最高位(符号位)在逻辑右移时被填充为0。
逻辑右移通常用于无符号数值的无损压缩。
逻辑右移将右边空出的位用0填充。
例如原始:11111100 ----- -4
右移一位:01111110 ----- 126
可见逻辑右移会改变负数。
算术右移
算术右移是带符号右移操作。它用于对带符号整数进行右移,保持数的符号位不变。
在算术右移中,最高位(符号位)的值会在右移时保持不变。右移后的空位用符号位填充。
算术右移通常用于有符号整数的操作,以保持符号的正确性。
在不溢出的情况下相当于除以2。
算术右移与逻辑右移相似,但对于有符号整数,它保留了符号位。
例如原始:11111100 ----- -4
右移一位:11111110 ----- -2
举例说明
通过这张图可以很直观地看出很多关系,比如不溢出的情况下算术左移一位相当于乘以2、不溢出的情况下算术右移相当于乘以2、负数的原码相当于正数的原码将符号数改为1、负数的原码取反+1得到补码、正数的原码反码补码均相等......
(by 归忆)