题目
要求仅通过调用给定的函数 bis
和 bic
,不使用任何其他的运算操作,完成或(or)运算和异或(xor)运算,函数 bis
和 bic
的声明和功能如下:
int bis(int x, int m); // 在m为1的每个二进制位上,将x对应的位置1
int bic(int x, int m); // 在m为1的每个二进制位上,将x对应的位置0
分析
不妨先推算一下bis和bic是如何实现的。
根据描述,bis的功能本身就是求 x or y(如果看不出来可以列一下真值表,这个比较直观,这里就不写了)。
至于bic,我们同样可以借助真值表分析一下:
// x bic y 的所有情况
1 bic 1 = 0 0 bic 1 = 0
1 bic 0 = 1 0 bic 0 = 0
可以发现只有当x的二进制位为1且m的二进制位为0的时候,结果对应的二进制位才为1,其余情况都为0
因此很容易得到 x bic y 的逻辑表达式 x & ~m
。
综上我们可以写出bis和bic的实现
int bis(int x, int m) {
return x | m;
}
int bic(int x, int m) {
return x & ~m;
}
实现or
显然or运算就是调用bis(x, y):
int bool_or(int x, int y) {
int result = bis(x, y);
return result;
}
实现xor
根据异或的逻辑表达式result = (x & ~y) | (~x & y) = (x & ~y) | ( y & ~x)
,以及上面的分析,我们只要通过调用bic函数完成x & ~y
和y & ~x
的计算,并将两个计算结果通过bis完成或运算即可:
int bool_xor(int x, int y) {
int result = bis(bic(x, y), bic(y, x));
return result;
}