位运算时效率很高的运算,可以提高程序的执行性能,但是他的优先级很低,你以为的结果并非是你要的
Java中的运算符的优先级如下:
我们可以看到左移右移的运算的优先级在+-之后
我这个程序是计算平方根:
while(left <= right) {
//取中点值,等值于mid = left+(right - left)/2,这里不能使用mid =(left+right)/2,可能越界
//这里一定要注意括号,千万别写成mid = left + (right - left)>>1
mid = left + ((right - left)>>1);
//如果mid的平方小于等于x,则可能是解,还需要看看有没有更接近的
if(mid * mid <= x) {
left = mid + 1;
//mid可能是解
retVal = mid;
} else {
//否则取后半段,这里不可能有解
right = mid - 1;
}
}
开始的时候写成了mid = left + (right - left)>>1
相当于mid = (left + (right -left)) >> 1也就是right >> 1
造成了死循环,程序一直在跑
同理,红色部分加个括号,结果会大不一样:
for(int i = arr.length - 1 ; i >= 0; i --) {
for(int j = 0; j < dp[i].length; j++) {
dp[i][j] = dp[i+1][j] + j - arr[i] >= 0 ? dp[i+1][j - arr[i]] : 0;
}
}