今天晚上练习赛的A没写括号,搞了好久,真的是醉了。。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
int main()
{cin>>t;while(t--){ll x,y;cin>>x>>y;if(x<y)swap(x,y);if(x==y)cout<<0<<endl;else if((x&y)==y)cout<<1<<endl;else cout<<2<<endl;}return 0;
}
在大多数编程语言中,比较运算符 ==
的优先级高于位运算符 &
。这意味着在没有括号的情况下,表达式 x == y & z
会被解释为 x == (y & z)
。
然而,表达式 (x & y) == y
中的括号是必要的,因为这里的 &
是位运算符,不是逻辑运算符。如果没有括号,表达式会被解释为 x & (y == y)
,这通常不是我们想要的结果,因为 y == y
总是 true
(除非 y
是NaN,但在大多数语言中,即使是NaN,NaN == NaN
也是 false
),所以 x & true
基本上就是 x
。
所以,(x & y) == y
的意思是:
- 先计算
x & y
,这是位与运算。 - 然后将结果与
y
进行比较。
括号确保了位与运算先于比较运算执行。如果没有括号,表达式将被错误地解释为 x & (y == y)
,这通常不是预期的行为。