java的三种移位运算符 :>>>,>> 和<<
计算机里面的带符号数用补码表示
- << : 带符号左移,
- >> : 带符号右移,
- >>> : 无符号右移,忽略符号位,空位都以0补齐
<<
- -12 在计算机中存储为二进制补码:1111 1111 1111 1111 1111 1111 1111 0100
- -12 << 3 即带符号左移3位,结果是:1111 1111 1111 1111 1111 1111 1010 0000
- 十进制:-96
>> 移位之后,正数依然是正数,负数依然是负数
- -12 在计算机中存储为二进制补码:1111 1111 1111 1111 1111 1111 1111 0100
- -12 >> 3 即带符号右移3位,符号位=1移动时高位补1,结果是:1111 1111 1111 1111 1111 1111 1111 1110
- 十进制为: -2;
>>> 移位之后一定是正数
- -12 >>> 3 就是右移三位,高位补零,为:0001 1111 1111 1111 1111 1111 1111 1110,十进制为:536870910。
正数的>>和>>>结果是一样的,因为移动时都是高位补0
应用:
二分查找中 int mid = (left + right) >>> 1;
可以保证left + right的和如果溢出也能得到正确结果
移位运算符妙用
要判断两个数符号是否相同时,可以对符号位进行异或运算
return ((a >> 31) ^ (b >> 31)) == 0;
无论是左移还是右移(包括无符号右移),都有一个共同的规则。 如果移动的位数超过规定的bit数,都会与最大移位数取模之后进行计算。
例如:
int型,32bits,如果是5<<33,其实就是5<<1
在JDK中,整形类型是有范围的,最大值为Integer.MAX_VALUE,即2147483647,最小值为Integer.MIN_VALUE -2147483648。