判断语句中位运算符的一个小坑

最近训练时敲代码总爱在 if 语句中有位算符时踩坑, 比如 if(i&1==0)if(i&i-1 == 0),本意是想判 i 是否为偶数和 i 是否为 2 的幂,但这么写都是错误的,导致程序不能输出正确结果。每次 debug 时又不明所以,耗了很长时间才找到。在这里记录下。

错误的原因是 == 运算符优先级要高于 & | ^ 这三个位运算符,故导致上面代码的判断顺序实际为 if(i & (1==0))if(i & (i-1 == 0))。 很痛苦呀,有没有。

建议:

  • 判断式中如果同时存在位运算符小于等于大于时,将位运算符表达式加上括号
  • 判等时,如果一边是常数一边是变量,将常数放于判等左边。 (TAT,当时听郝斌老师讲这条时还不以为意,心想判等自己肯定不会写成 = , 现在想来,真是内牛满面呀,这条规则实在太好了)