右移(>>)与无符号右移(>>>)
有符号类型和无符号类型
在java中的数值类型都是有符号的,并不像C语言一样存在无符号类型。以int类型为例,int类型的长度为4个字节32位,其首位作为符号位0表示正数,1表示负数。因此-9与9在计算机中的表现形式如下图所示。
原码、反码、补码
在计算机中,所有对数值的运算的是基于补码进行的,这点特别重要,如果没搞清楚这一点经常会对计算结果感到奇怪。就比如-1>>>1与-2>>>1的结果为什么是相同的,而且都是2147483647(Integer.MAX_VALUE)。以-9为例其原码、反码、补码如下图所示。
>>与>>>的计算逻辑
(>>)与(>>>)都是对补码进行计算的,他们俩的区别在于>>在补齐高位时使用符号位进行补齐;而>>>补齐高位时恒使用0补齐。
- 以-9为例进行>>2计算,其计算逻辑如下图所示,-9>>2=-3
- 以-9为例进行>>>2计算,其计算逻辑如下图所示,-9>>>2=1073741821
为什么 -1>>>1 = -2>>>1 = Integer.MAX_VALUE = 2147483647?
基于上面的逻辑和步骤,我们计算-1>>>1和-2>>>1时发现,其结果是相等的且都等于Integer.MAX_VALUE,读着可以自己尝试验证一下。