题目
题意:先输入t(多少组数据),然后输入操作次数n和要进行操作的数据m,然后输入n行每行是对数据的操作。
解题思路
因为题目给出了对二进制数操作位数不超过60位,所以我们创建一个长度为60的数组x[61],把数据转化成二进制数存入数组内,然后我们根据要进行的操作对60-pos+1位置上的数字进行与(and)和或(or)的操作,并判断x[60-pos+1]位置上是否为0还是1,进行玩所有的操作完之后,再把该二进制数组转换为相应的十进制数。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1;
int x[61];
ll zz;
void f(ll z)
{
int pos1 = 60;
while (z != 0)
{
x[pos1 --] = z % 2;
z /= 2;
}
}
void f3()
{
zz = 0;
ll q = 1;
for (int i = 60; i > 0; i --)
{
zz += q * x[i];
q *= 2;
}
}
int main()
{
int t;
cin >> t;
while (t --)
{
ll n, z;
char a[10];
ll b, c;
cin >> n >> z;
for (int i = 0; i <= 60; i ++) x[i] = 0;
f(z);
for (int i = 0; i < n; i ++)
{
cin >> a >> b >> c;
if(strcmp(a,"And") == 0)
{
if(x[60 - b + 1] == 1 && c == 1) x[60 - b + 1] = 1;
else x[60 - b + 1] = 0;
}
else
{
if(x[60 - b + 1] == 1 || c == 1) x[60 - b + 1] = 1;
else x[60 - b + 1] = 0;
}
}
f3();
cout << zz << endl;
}
return 0;
}