0
点赞
收藏
分享

微信扫一扫

《深入理解计算机系统(CSAPP)》 P39 - 2.12 答案解析

兮城 2022-01-31 阅读 47
c语言

题目

要求仅通过调用给定的函数 bisbic,不使用任何其他的运算操作,完成或(or)运算和异或(xor)运算,函数 bisbic的声明和功能如下:

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 & ~yy & ~x 的计算,并将两个计算结果通过bis完成或运算即可:

int bool_xor(int x, int y) {
    int result = bis(bic(x, y), bic(y, x));
    return result;
}
举报

相关推荐

0 条评论