以前我们写二分查找的时候,是这么写的:
public static int binarySearch2(int []a,int target){
int i=0,j=a.length-1;
while(i<=j){
int mid=(i+j)/2;
if(a[mid]==target){
return mid;
}else if(a[mid]<target){
i=mid+1;
}else {
j=mid-1;
}
}
return -1;
}
这么写,其实存在错误:
int mid=(i+j)/2;在i,j都比较小的时候没有问题,但是,一旦j值很大很大,逼近int型的边界限定的时候,如果a[mid]<target,i=mid+1,j不变,那么此时此刻i值变为int型边界限定的一半,那么i+j的和就超过了int型的边界限定了,那么(i+j)/2中先进行的i+j运算就会出错,那么得到的新mid值就有错。
正确写法:
public static int binarySearch2(int []a,int target){
int i=0,j=a.length-1;
while(i<=j){
int mid=(i+j)>>>1;
if(a[mid]==target){
return mid;
}else if(a[mid]<target){
i=mid+1;
}else {
j=mid-1;
}
}
return -1;
}
可以看到,int mid=(i+j)/2;变成了int mid=(i+j)>>>1;
解释一下: