方法1
start + (end - start) / 2
方法2
int mid = (start + end) >>> 1
它通过移位实现了除以 2,但。。。这样难道不会导致溢出吗?
首先大家可以补一下 补码 的知识。
其实问题的关键就是这里了>>> ,我们知道还有一种右移是>>。区别在于>>为有符号右移,右移以后最高位保持原来的最高位。而>>>这个右移的话最高位补 0。
所以这里其实利用到了整数的补码形式,最高位其实是符号位,所以当 start + end溢出的时候,其实本质上只是符号位收到了进位,而>>>这个右移可以带着符号位右移,所以之前的信息没有丢掉。
但>>有符号右移就会出现问题了,事实上 JDK6 之前都用的>>
方法3
1、将相同的位进行相加,结果等于两数按位与的结果的两倍;(0+0)/2=0 (1+1)/2=1
2、将不同的位进行相加,其结果等于按位异或的结果。(0^1)=1 >>1=0.5
代码如下:
public static int mean(int a, int b){
return (x & y) + ((x ^ y) >> 1);