位移运算符优先级
下面的代码用于取4和2的中点,但结果不是我们预期中的3,原因是位移运算符优先级低于加减:
1 public class test { 2 public static void main(String[] args) { 3 System.out.println(2+(4-2)>>1); 4 } 5 }
输出:2
正确的写法如下所示,加上小括号保证位移先于加减执行:
1 public class test { 2 public static void main(String[] args) { 3 System.out.println(2+((4-2)>>1)); 4 } 5 }
输出:3
另外上面的取两个数的中点是一种典型的写法,一般将取两个数中点的操作写为
1 mid = low + ((high-low)>>1)
而不是
mid = (high+low)>>1
是考虑到了两个数相加有可能会溢出的情况。
x>>1和x/2不同之处
当x大于等于零的时候, x>>1和x/2能得到相同的结果;
当x = -1时,
-1>>1的结果是-1;
而-1/2的结果是0!
这一点在数组下标的计算中尤其需要注意,-1/2得到的是有效下标, 而-1>>1是无效的下标;
所以位运算的方法要慎用,如果考虑不周很容易出错;
TALK IS CHEAP, SHOW ME THE CODE