Petya learned a new programming language CALPAS. A program in this language always takes one non-negative integer and returns one non-negative integer as well.
In the language, there are only three commands: apply a bitwise operation AND, OR or XOR with a given constant to the current integer. A program can contain an arbitrary sequence of these operations with arbitrary constants from 0 to 1023. When the program is run, all operations are applied (in the given order) to the argument and in the end the result integer is returned.
Petya wrote a program in this language, but it turned out to be too long. Write a program in CALPAS that does the same thing as the Petya's program, and consists of no more than 5 lines. Your program should return the same integer as Petya's program for all arguments from 0 to 1023.
The first line contains an integer n (1 ≤ n ≤ 5·105) — the number of lines.
Next n lines contain commands. A command consists of a character that represents the operation ("&", "|" or "^" for AND, OR or XOR respectively), and the constant xi 0 ≤ xi ≤ 1023.
Output an integer k (0 ≤ k ≤ 5) — the length of your program.
Next k lines must contain commands in the same format as in the input.
3 | 3 ^ 2 | 1
2 | 3 ^ 2
3 & 1 & 3 & 5
1 & 1
3 ^ 1 ^ 2 ^ 3
0
You can read about bitwise operations in https://en.wikipedia.org/wiki/Bitwise_operation.
Second sample:
Let x be an input of the Petya's program. It's output is ((x&1)&3)&5 = x&(1&3&5) = x&1. So these two programs always give the same outputs.
题目大意:
化简位运算,输出在5步以内。
思路:
①我们初始设定x为1023,y为0,然后将两个数按照操作过程得到结果。
②然后我们对于每一位进行讨论,如果最终结果上:
1.x和y这一位都是1,那么相当于在这一位上,或上 1、
2.x和y这一位都是0,那么相当于在这一位上,或一个1然后亦或一个1、
3.x是1y是0,那么相当于不动。
4.x是0y是1,那么相当于在这一位上,亦或一个1.
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
int x=1023,y=0;
for(int i=0;i<n;i++)
{
char s[15];
int d;
scanf("%s%d",s,&d);
if(s[0]=='|')
{
x=x|d,y=y|d;
}
else if(s[0]=='&')
{
x=x&d,y=y&d;
}
else x=x^d,y=y^d;
}
int a,b,c;a=-1,b=-1,c=-1;
for(int i=0;i<10;i++)
{
int xx=x&(1<<i);
int yy=y&(1<<i);
if(xx>0&&yy>0)
{
if(a==-1)a=1<<i;
else a+=1<<i;
}
if(xx==0&&yy==0)
{
if(a==-1)a=1<<i;
else a=a|(1<<i);
if(b==-1)b=1<<i;
else b=b|(1<<i);
}
if(xx==0&&yy>0)
{
if(b==-1)b=1<<i;
else b=b|(1<<i);
}
}
int cont=0;
if(a!=-1)cont++;
if(b!=-1)cont++;
if(c!=-1)cont++;
printf("%d\n",cont);
if(a!=-1)printf("| %d\n",a);
if(b!=-1)printf("^ %d\n",b);
if(c!=-1)printf("& %d\n",c);
}
}