# B 二进制
题目链接: https://ac.nowcoder.com/acm/contest/8564/B


单纯与或者单纯或单纯异或都支持交换律,但是他们放在一起就不支持交换律了,比如 1 先和 0 与再和 1 或结果是 1,但是 1 先和 1 或再和 0 与结果就不一样,可以设两个数,一个所有位都是 0,一个所有位都是 1,把这两个分别进行上述操作,最后得出来的结果按位对比,如果 0 变成了 1 且 1 变成了 0 则这个位肯定是异或 1,如果 0 变成 0 且 1 变成 0 则这一位是与 0,如果 0 变成 1 且 1 变成 1 这一位肯定是或 1,按照这个规律可以求出这个数,任何一个数与 1 或 0 异或 0 都不变,所以可以设置三个数,一个全设为 1,另外两个全设为 0,当这个位是与 0 时,就用全为 1 的变量减去 (1<<i) 这一位上的数,另外两个同理
#include <bits/stdc++.h> | |
#define debug freopen("in.txt","r",stdin); freopen("out.txt","w",stdout) | |
#define ios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0) | |
using namespace std; | |
typedef long long ll; | |
typedef unsigned long long ull; | |
const int MAXN=1e6+100; | |
const double pi=acos(-1); | |
const int MOD=1e9+7; | |
const int INF=0x3f3f3f3f; | |
const int SUB=-0x3f3f3f3f; | |
const int eps=1e-4; | |
int a=0,b=(1<<20)-1; | |
int main(){ | |
ios; | |
int n; | |
cin>>n; | |
for(int i=1;i<=n;i++){ | |
int op,v; | |
cin>>op>>v; | |
if(op==1){ | |
a&=v; | |
b&=v; | |
} | |
else if(op==2){ | |
a|=v; | |
b|=v; | |
} | |
else{ | |
a^=v; | |
b^=v; | |
} | |
} | |
int yu=(1<<20)-1,huo=0,yihuo=0; | |
for(int i=0;i<20;i++){ | |
if( (a>>i)&1 ){ | |
if((b>>i)&1) huo+=(1<<i); | |
else yihuo+=(1<<i); | |
} | |
else if(!((b>>i)&1)) yu-=(1<<i); | |
} | |
cout<<3<<'\n'; | |
cout<<1<<' '<<yu<<'\n'; | |
cout<<2<<' '<<huo<<'\n'; | |
cout<<3<<' '<<yihuo<<'\n'; | |
return 0; | |
} |