问题
在做力扣时,用到了二分法,遇到了个很奇怪的问题,
二分法,取中间的
mid = left + (right - left) / 2;
然后,想着位移效率高,于是把除以2,换成了向右位移1
mid = left + (right - left) >> 1;
然后,问题来了,报错,说越界错误,很郁闷,没想通咋就报数组据越界了
我以为是,Java 中向右位移1,和除以2,会不会是啥超范围咋了,于是乎,打印了一堆做测试,发现完全正确啊,除以2的结果就是向右位移1。上网搜,已有大佬给出
- 对于非负数,除以2(/2),等于,向右位移1(>>1)
- 对于负数,且是偶数,除以2(/2),等于,向右位移1(>>1)
- 对于负数,且是奇数,除以2(/2),不等于,向右位移1(>>1)
所以, 我是遇到了什么????
原因
再仔细一看,是运算符的优先级问题
自己写的是 mid = left + (right - left) >> 1; 尽管是希望先算后面的 (right - left) >> 1但是,算术运算符的优先级是大于位移运算符的优先级的,所以,是先计算 left + (right - left) 了,然后再位移 >_<
应该写成这样
mid = left + ((right - left) >> 1);