二分查找时关于mid的计算问题

在使用二分查找时我们计算mid时通常会有两种写法:
第一种:

while(l<r){
int mid = (l+r)>>1;
...
}

对于这样的写法常常存在mid超界问题,也就是lr可能接近int的最大值了,导致l+r超出int的最大值,出现逻辑错误。
因此我们常常使用第二种写法,即位运算的写法:

while(l<r){
int mid = (r-l)>>1+l;
...

如果不注意,我们很可能就会这么写,但是这种写法一般会出现死循环的问题,为什么呢?因为>>的优先级低于+,这就会导致在计算mid时是先计算1+l,然后计算>>,也就是实际上的运算是这样的(r-l)>>(l+1),很显然这不是我们想要的计算,因此正确的写法为:

while(l<r){
int mid = l+((r-l)>>1);

也就是必须在(r-l)>>1外围再加上一个括号才是正确的写法。


这虽然只是一个小问题,但实际使用中,往往是细枝末节导致程序出现bug。养成良好习惯,才能让程序按照我们想的运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值