按位与逻辑运算符顺序表及注意事项
优先级(1表示最高,逐渐递减,相同优先级则看结合方向) | 运算符 | 含义 | 结合方向 |
---|---|---|---|
2 | ! | 逻辑非 | 右到左 |
2 | ~ | 按位取反 | 右到左 |
5 | << | 左移 | 左到右 |
5 | >> | 右移 | 左到右 |
6 | > | >= | < | <= | 大于| 大于等于|小于|小于等于 | 左到右 |
7 | == | != | 等于| 不等于 | 左到右 |
8 | & | 按位与 | 左到右 |
9 | ^ | 按位异或 | 左到右 |
10 | | | 按位或 | 左到右 |
针对这个表,我想说几点:
-
在平时写if语句时,经常容易出现按位与条件判断的错误
a = 1; b = 2; if(a & b) cout<<"Yes"<<endl; else cout<<"No"<<endl;
这段代码的运算是:
- 计算a&b=1&2=0
- 输出"No"
a = 1; b = 2; if(a & b != 0) cout<<"Yes"<<endl; else cout<<"No"<<endl;
根据优先级表计算
- b != 0为真,返回1
- a & 1 = 1为真,输出"Yes"
结果大相径庭!
因此,在实现位运算有关的算法问题时,应该多注意这样的运算顺序所导致的非算法问题。多使用中间变量,多用括号,确保每一次运算都在你的掌控之内。
-
左移右移的运算符优先级在位运算中较高,但仍比加减法低。如:
-
希望对a进行乘2加1的操作,
-
a = 1<<h + 1;会先执行加法运算,再执行位运算,和预想有出入;
-
a = 1<<h | 1;将加法替换为与运算就没有这个问题了。
-
-
与、异或、或的算法优先级不同
- 在只含位运算的算式中,与运算优先级最高,其次是异或,最后为或。