codeforces div 1 443 A. Short Program (位运算的理解)
题目链接:
题意:
一段程序,最多5E5个操作,每个操作的格式为 <opt,x> ,opt表示位或,位异或,位与 三种位运算的一种,x表示范围0..1023的数。现在要求将该程序化简至最多 5个操作,使得对于0..1023的输入,输出与该程序同样的结果。
思路 :
关键在于想起,位运算还是按照二进制位的运算。我们考虑每位即可。
如果初始是0,现在变成了1,那么实际上我们并不确定,这个操作是xor 1 还是 or 1
因此我们需要两个初始的数,一个所有二进制位上都是0,另一个所有二进制位上都是1.
也就是0和1023
对于某个二进制位
如果初始的 (0,1)变成了 (1,1),那么说明这个位置上的位运算是or
如果初始的 (0,1)变成了(1,0) 那么说明这个位置上的位运算是xor
如果初始的 (0,1)变成了(0,0) 那么说明这个位置上的位运算是and
如果初始的 (0,1)变成了(1,0) 那么说明这个位置上没有进行位运算操作。
1#include <bits/stdc++.h>
2using namespace std;
3int main()
4{
5 int n;
6 cin>>n;
7 char opt[3];
8 int x;
9 int a = 0;
10 int b = 1023;
11 for ( int i = 1 ; i <= n ; i++)
12 {
13
14 cin>>opt>>x;
15 if (opt[0]=='|') a |=x,b|=x;
16 if (opt[0]=='^') a^=x,b^=x;
17 if (opt[0]=='&') a&=x,b&=x;
18 }
19
20
21 // 01 no
22 // 11 or
23 // 10 xor
24 // 00 and
25
26 int OR=0,XOR=0,AND=1023;
27 for ( int i = 0 ; i < 10 ; i++)
28 {
29
30 int A = (a>>i)&1;
31 int B = (b>>i)&1;
32 // cout<<"A:"<<A<<" B:"<<B<<endl;
33 if (A&&B) OR|=(1<<i);
34 if (A&&!B) XOR|=(1<<i);
35 if (!A&&!B) AND-=(1<<i);
36 }
37 cout<<3<<endl;
38 cout<<"| "<<OR<<endl;
39 cout<<"^ "<<XOR<<endl;
40 cout<<"& "<<AND<<endl;
41}