位运算 |与|| &与&&的区别

今天在写每日一题时,看到官方题解中的函数有如下:

private boolean checkAndUnlockDescendant(int num) {
        boolean res = lockNodeUser[num] != -1;
        lockNodeUser[num] = -1;
        for (int child : children[num]) {
            res |= checkAndUnlockDescendant(child);
            System.out.println(res);
        }            
        return res;
    }

 对于 |=运算还不是很清楚。经过了解就在这里就来讲解下:

||与&&运算相信大家都很清楚。但是也许对于|与&还有些许陌生。在位运算中,假设a=25(11001),b=6(00110), 那么运算 a|b 得到的结果将会是31。在这里并不是做了想相加处理,而是每一位都做了 | 运算, 1|0 =1,那么运算完的结果将会是 11111即31。当然呢 & 运算同理,每一位都做了 &, 1&0=0。那么 a&b = 0。这里是| 与 & 在位运算中的作用。但|| 与&&就不能这样用。

我们可以看到|与&都在进行每一位的对比,直到结束。但是 || 与 &&却是一旦发现问题就会停止。如 a||b||c,当a==true时就会停止比较后面的字符,因为结果已经定了,即后面b,c不会执行。同理,&&出现false时也会停止后面的比较。这里有个关于||的例子:

public static void main(String[] args) {
        String s1 = "abc";
        String s2 = null;
        if(s1.equals("abc")||s2.equals("")) System.out.println("executed");
        if(s1.equals("abc")|s2.equals("")) System.out.println("executed as well");
    }

运行结果如下:

 

这是因为在执行 s2.equals("")时s2是null无法执行报错。但是第一个判断中s1.equals("abc")==true所以直接不执行后面的语句了,所以没有报错。

现在回到开始的问题,为什么这个题要用|而不是||?这是因为在 | 后的函数不仅承担着返回boolean值的任务,还承担着修改子节点boolean值的任务。如果一开始res便等于true,那么剩下的子节点的boolean永远不会发生变化。因此必须保证后面的递归函数执行下去,才使用|的。一般情况下使用||效率显然更高。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值