#include <stdio.h>
#include <string.h>
int ad(int n)
{
if (n > 1)
{
return 1;
}
return 0;
}
//转为二进制
void zhuan2(int n, int *a)
{
int m = n;
if (m < 0)
{
m = -m;
}
int k = 31;
while (m > 0)
{
a[k--] = m % 2;
m /= 2;
}
//如果是负数 取反加一
if (n < 0)
{
for (int i = 0; i < 32; i++)
{
if (a[i] == 0)
a[i] = 1;
else
a[i] = 0;
}
int as = 31;
a[31]++;
while (ad(a[as]))
{
a[as] = 0;
as--;
a[as]++;
}
}
}
int main(int argc, char const *argv[])
{
int t;
scanf("%d", &t);
while(t--)
{
int aa, bb;
char op;
int a[32], b[32], x[32];
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(x, 0, sizeof(x));
int sum = 1;
scanf("%d %d %c", &aa, &bb, &op);
zhuan2(aa, a);
zhuan2(bb, b);
if (op == '^') //^ : x 的每位取值只有1种
{
sum = 1;
}
else if (op == '|')
{
for (int i = 0; i < 32; i++)
{
if (b[i] == 0)
{
if (a[i] == 0)
{
x[i] = 1; //只能为0
}
else
{
x[i] = 0; //不存在一个数 | 1 等于0
}
}
else
{
if (a[i] == 0)
{
x[i] = 1; //只有0 | 1 等于 1
}
else
{
x[i] = 2; //1 和 0 | 1 都等于1
}
}
sum *= x[i];
}
}
else if (op == '&')
{
for (int i = 0; i < 32; i++)
{
if (b[i] == 0)
{
if (a[i] == 0)
{
x[i] = 2; //1或0
}
else
{
x[i] = 1; //只能为0
}
}
else
{
if (a[i] == 0)
{
x[i] = 0; //0
}
else
{
x[i] = 1; //1
}
}
sum *= x[i];
}
}
printf("%d\n", sum);
}
return 0;
}


被折叠的 条评论
为什么被折叠?



