1.关于负数问题
当l=-200,r=-99时
(l+r)/2=-149
l+(r-l)/2 =-150
注意:如果/2写成>>1的话,要括号!!!MID=l+((r-l)>>1);不然就错了,>>的优先级别比较低。
int i=-999999;
int a=i/2;
int b=i>>1;
System.out.println("a:" + a + " b:" + b);
结果:
a:-499999 b:-500000
原因:
int类型的取整是向0取整,即使被取整的数绝对值变小
而右移是向下取整,即使被取整的数值变小
所以对于正数时两者相同,而到了负数则变大
2.关于溢出问题
int x = 1999999998;
int y = 1999999998;
int mid = (x+y) / 2;
int mid2 = x + (y-x) / 2;
System.out.println(mid); //-147483650
System.out.println(mid2); //1999999998