问题产生
二分法每次更新mid需要除以2,由于移位运算的优先级是高于除法的所以
int left=0,right=10
while(left<=right)
{
mid = (left+right)/2;
do alter left right
}
初始化版本,left+right 可能溢出
int left=0,right=10
while(left<=right)
{
mid = left+(right-left)/2; //优化版本
do alter left right
}
版本优化移位
int left=0,right=10
while(left<=right)
{
mid = left+(right-left) >> 1;
do alter left right
}
这样写是错误的天真的以为 执行(right-left)/2。
事实上
执行 (left+(right-left))/2;
问题解决
int left=0,right=10
while(left<=right)
{
mid = left+(right-left >> 1);
do alter left right
}