- 基本概念: 计算机都是操作数据的补码,而对于正数,原码(第一位为符号位,0表正数,1表负数),反码,补码都是一样的,而对于负数而言,反码是原码除了符号位的取反,补码则是在反码的基础上加1,有进位则进位,但不改变符号位
- 对于一个八位的二进制数据,所能表示的范围就是-128~127(即除了符号位之后还有7个bit,每个bit都有0和1两种可能,所以负数最小的取值的绝对值就是2的7次方,正数最大的取值的绝对值也是2的7次方-1),至于为什么是2的7次方-1,可以参阅这位老哥的文章或者其他大佬的文章
1.<<,左移,不分正负数,低位补0
比如:
对于一个正数1,补码为: 00000001 值:1*2的0次方=1
进行左移2位之后: 00000100 值:1*2的2次方=4
对比值 两者相差2的2次方,所以左移n位就乘以2的n次方
2.>>,右移,正数高位补0,负数高位补1
比如:
Ⅰ. 正数右移:
对于一个正数4,其补码为:00000100 值:1*2的2次方=4
进行右移2位后为: 00000001 值: 1
对比值 两者相差2的2次方,所以右移n位就除以2的n次方
Ⅱ.负数右移
对于负数-4,其原码为: 10000100
除了符号位,其他位取反,即0变1,1变0,所以反码为: 11111011
反码末位+1,所以补码为: 11111100
由于位运算操作的是补码,右移2位之后: 11111111
对于操作之后的补码转化为反码,末尾-1: 11111110
又从反码获取原码,符号位不变,其余取反: 10000001
所以得到的数值为: -1
上面负数右移得到的结论同样是右移n位就除以2的n次方,而对于无符号右移就不同了
3.无符号右移>>>又叫作逻辑右移,无论正负数,高位均补0
无符号右移针对于正数和>>无异
负数无符号右移示例(以8bit为例,在java中int类型是32bit,逻辑右移算出来的值很大):
-4补码: 11111100
无符号右移2位: 00111111
将操作完毕之后的补码转化为原码: 01000001
所以对于负数,>>>和 >> 区别还是很大的