一个有助于思考布尔运算和应用掩码运算的典型方式之间的关系:
int bis(int x, int m); // 根据掩码m来置x
int bic(int x, int m); // 根据掩码m来清x
// 仅使用bis和bic来计算 x|y
int bool_or(int x, int y) {
int r = bis(x, y);
return r;
}
// 仅使用bis和bic来计算 x^y
int bool_xor(int x, int y) {
int r = bis(bic(x, y), bic(y, x));
return r;
}
bis运算等价于布尔or,bic(x, m)等价于 x&~m;
现实现x对应位为1且m对应位为0时,该位为1,故:
x^y = (x&~y) | (~x&y)
故:bis(bic(x, y), bic(y, x))
>> 在c/c++大多数实现中都是算术右移:
int i=-1;
i = i>>4;
printf("%d\n", i);
输出是-1
1 << 2 + 3 << 4 等价于 1 << (2 + 3) << 4
故输出512而不是52