Lichord

学习笔记

0%

Java移位运算符

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。