位运算有符号右移和无符号右移
<< :左移运算符,n<<1相当于 n*2
>> :右移运算符,n>>1相等于n/2
>>>:无符号右移,忽略
int a=-1;
-1的32进制位:
源码 : 0000 0000 0000 0000 0000 0000 0000 0001
反码 : 1111 1111 1111 1111 1111 1111 1111 1110
补码 : 1111 1111 1111 1111 1111 1111 1111 1111 (在反码基础上+1)
a<<2: 1111 1111 1111 1111 1111 1111 1111 1100
a>>2: 1111 1111 1111 1111 1111 1111 1111 1111 (右移两位,左边高位再补两个1,所以看着没什么变化)
a>>>2: 0011 1111 1111 1111 1111 1111 1111 1111 (无符号右移跟上个比起来就是高位不补1)
上面-1 >>2看着没什么变化可以换成-5 试试:
int a=-5;
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(a>>2));
System.out.println(a>>2);
11111111111111111111111111111011
11111111111111111111111111111110
-2
-------------------------------------------------------
int a=-5;
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(a>>>2));
System.out.println(a>>>2);
11111111111111111111111111111011
111111111111111111111111111110
1073741822