(n& 1)和n& 1之间的差异

时间:2014-08-12 05:27:27

标签: c++ c bit-manipulation bitwise-operators

我试图解决Counter Game问题:

" Louise和Richard玩游戏。他们有一个计数器设置为N. Louise获得第一个转弯,之后轮流交替。在游戏中,他们执行以下操作。

  • 如果N不是2的幂,它们会将计数器的最大功率减去2,小于N.

  • 如果N是2的幂,它们会将计数器减少一半N.

  • 结果值是新的N,它再次用于后续操作。

当计数器减少到1时游戏结束,即N == 1,最后一个进行有效移动的人获胜。

鉴于N,你的任务是找到游戏的赢家。"

要解决问题,I implemented位操作和got accepted

#include <iostream>
#include <cstdio>

int main() {
    long long unsigned int n, tmp;
    int cnt, t;
    scanf("%d", &t);
    while(t--) {
        scanf("%llu", &n), tmp=n;
        cnt=0;
        while(tmp) tmp&=tmp-1, cnt++;
        cnt--;
        while((n&1)==0) n>>=1, cnt++;
        if(cnt%2==0) printf("Richard\n");
        else printf("Louise\n");
    }
    return 0;
}

然而,在编码期间,我编码while(n&1==false)而不是while((n&1)==false),因此无法获得所需的结果。编码while(!(n&1))给出了预期的结果,但由于某些来源(我忘记了),我(!a而不是a==false)是不好的做法。我知道while(!n&1)while(!(n&1))之间的区别,但我不知道while(n&1==false)while((n&1)==false)。得知后者是和不同的,请问这个区别,拜托?

3 个答案:

答案 0 :(得分:4)

正如您所见here==的优先级高于&的优先级。

因此,n&1==false被解释为n&(1==false) 而非 (n&1)==false,因此您需要括号。

答案 1 :(得分:4)

很多人认为这是C的设计错误。

虽然logical-and操作的优先级应该低于相等比较,但对于bitwise-and来说,同样的问题更为可疑,因为按位操作自然更接近数学运算。

C ++继承了相同的设计错误,以实现向后兼容。

一个好的规则总是将按位运算括起来以避免意外。

答案 2 :(得分:2)

==在C ++中的优先级高于&source)。

因此while(n&1==false)被视为while (n & (1 == false)),实际上是while (n & 0)