今天跟同事说起二分查找法中常见的一个问题,就是计算中点时会溢出的问题。

  常见的方法(a+b)/2就是铁定会溢出的方法。如果a和b很大,之和超出了它们定义的范围,那么运算结果可能会是负数,这绝对不是我们想要的。

  之后同事说他看到一个算法是(a+b)>1。其实这个问题只能说缓解了溢出的问题,实际问题还是存在的。为啥?比如int,当发生上溢的时候,溢出的进位其实进入了符号位;而右移的时候把符号位移到了第一位,此时计算结果是正确的;但是如果是无符号整型,溢出的时候已经丢弃了进位,右移后结果要少差一半。

  所以最好还是用a+(b-a)/2这样。除二或者右移一位都是可以的。当然,前提是因为我们知道a和b作为数组下标,都是正数,因此b-a不会下溢。如果你的数组奇怪到居然用负数左下标,呃,好吧,a和b做右移或除2处理再相加吧。不过记得要判断两个都是奇数的情况哦!