位运算的坑

文章讨论了在Java中使用位运算优化算法时需要注意的运算符优先级问题。在计算平方根的二分查找算法中,错误地使用了位右移操作,导致了(left+(right-left))>>1的结果实际上是(right>>1),从而造成死循环。正确做法是添加括号确保运算顺序,即(left+(right-left))>>1。
摘要由CSDN通过智能技术生成

位运算时效率很高的运算,可以提高程序的执行性能,但是他的优先级很低,你以为的结果并非是你要的

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;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值