有位运算移位操作的时候,特别是在比较中(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;
}