论逻辑运算与位运算(&与&&,|与&&)

昨天参加了一下午的code review会议,看到某些同事的代码中出现了逻辑运算与位运算混用的情况,觉得有必要针对这个问题进行说明

目录

1 & 与&&

2 | 与 ||的区别

3 对性能的影响


1 & 与&&

&是位运算,在二元运算中输出的是位运算后的值

a = 0xff;
b = 0x03;

c = a & b;

上述计算中c = 0x03;其二进制计算过程如下

0xff ---> 1111 1111
0x03 ---> 0000 0011
计算结果为 0000 0011

如果是&&运算,那么输出的就是0/1,如:

a = 0xff;
b = 0x03;

c = a & b;
d = a && b;

d的结果为1,那么问题来了,如果在逻辑判断中,使用二者会有什么区别?

a = 0xff;
b = 0x03;

c = a & b;
d = a && b;

if (a & b)
{
    DoSomething;
}

与

if (a && b)
{
    DoSomething;
}

从语法和逻辑上,二者都不会出错,但是如果运算符左右不是数值而是表达式,问题就有了区别

if( (a < 1) & (b > 1))  //先计算a < 1的结果 0,然后计算b > 1的结果 1,最后对两个结果做与运算
{
    DoSomething;
}

if( (a < 1) && (b > 1)) //此时由于a < 1为 0,if语句直接不成立,不再计算 b > 1的结果
{
    DoSomething;
}

2 | 与 ||的区别

在逻辑语句中如果混用,语法和逻辑上没错误,运行时的区别与上述问题雷同,即:

if( (a > 1) | (b < 1))  //先计算a > 1的结果 1,然后计算b < 1的结果 0,最后对两个结果做或运算
{
    DoSomething;
}

if( (a > 1) || (b < 1)) //此时由于a > 1结果为 1,if语句成立,不再计算 b < 1的结果
{
    DoSomething;
}

3 对性能的影响

虽然从示例来看问题不大,但是在具体的使用环境中,会有天壤之别,考虑如下两种情景

(1) &与&&,| 与 || 两侧均为复杂表达式甚至某些接口调用,此时执行一侧和两侧全执行,效率相差很大,如果表达式右侧是需要硬件调用的,问题更大。

(2)  &与&&,| 与 || 两侧表达式虽然简单,但是其外部有大循环的时候,对性能影响绝对不可忽略。

综上,二者的使用还是要严格区分的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值