有位运算移位操作的时候,特别是在比较中(if)需要移位的,一定要注意i的范围,i最好最好不要超过30,数据类型最好用unsigned类型,保证每一次移位,没有超过自己定义的数据类型,避免出现不必要的差错。
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
int n;int m; cin>>n>>m;
bitset<1000> one;
bitset<1000> zero;
one.set();
zero.reset();
for (int i=1;i<=n;i++)
{
string s;long long t;
cin>>s>>t;
if (s=="AND")
{
one&=t;
zero&=t;
}
else if (s=="OR")
{
one|=t;
zero|=t;
}
else if (s=="XOR")
{
one^=t;
zero^=t;
}
}
int m2=0,ans=0;
for (int i=29;i>=0;i--)//注意这里,如果i>=31,m要用unsigned int 类型,位运算移位的时候一定要注意移位的范围在定义的类型范围里面
{
if (zero[i]==1)
{
ans+=(1<<i);
}
else if (((one[i]==1))&&((m2+(1<<i))<=m))
{
ans+=(1<<i);
m2+=(1<<i);
}
}
cout<<ans<<endl;
}