我试图解决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)
。得知后者是和不同的,请问这个区别,拜托?
答案 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)
。