| 时间限制 | 内存限制 | 
|---|---|
1000 ms | 
65536 KB | 
# 题目描述
给出两个整数 和一个四进制位运算符 ,求 和 在四进制下进行 运算的结果。
 {与  & , 或  |  },记  为一位的四进制数,真值表如下:
- 与运算:
 
| 与 | ||||
|---|---|---|---|---|
- 或运算:
 
| 或 | ||||
|---|---|---|---|---|
# 输入格式
不定组输入,不超过 组,每组一行:
每行依次为 ,中间用一个空格间隔。
保证  均为十进制表示的  unsigned int  范围内整数; 一定是  & , |  中的一个。
# 输出格式
每组一行, 个 十进制表示的 无符号整数,为 在四进制下进行 运算的结果。
# 输入样例
6 & 9  | |
6 | 9  | 
# 输出样例
5  | |
10  | 
# 提示
不妨观察一下对于四进制位 , a & b  跟  a | b  与  之间的关系吧。
# 题解:位运算
不难发现,与运算就是该位两个数取最小值,或运算就是取最大值,于是我们按题意模拟即可。
时间复杂度:,其中 为数据组数, 为值域。
参考代码:
#include <stdio.h> | |
typedef unsigned int uint;  | |
uint a, b;  | |
char op;  | |
uint min(uint a, uint b)  | |
{ | |
return (a < b) ? a : b;  | |
} | |
uint max(uint a, uint b)  | |
{ | |
return (a > b) ? a : b;  | |
} | |
int main()  | |
{ | |
    // freopen("X.in", "r", stdin); | |
    // freopen("X.out", "w", stdout); | |
while (~scanf("%u %c %u", &a, &op, &b))  | |
    { | |
int cnt = 0;  | |
uint res = 0;  | |
while (a || b)  | |
        { | |
uint bitA = a & 3, bitB = b & 3;  | |
            uint bit; | |
if (op == '&')  | |
bit = min(bitA, bitB);  | |
            else | |
bit = max(bitA, bitB);  | |
res |= bit << (cnt << 1);  | |
a >>= 2, b >>= 2, ++ cnt;  | |
        } | |
printf("%u\n", res);  | |
    } | |
return 0;  | |
} |