注:内容都是来自 面试宝典 的,博客是写给自己看的总结。
1. 位运算的奇妙应用
(1)用一个表达式,判断一个数 X 是否是 2 的 N 次方 (1,2,4,8,16,..),不可用循环语句。
答:2 的 0 次方写成二进制是:0
2 的 1 次方写成二进制是:10
2 的 2 次方写成二进制是:100
2 的 3 次方写成二进制是:1000
所以表达式为:!(X & ( X - 1)) // 位与运算
(2)下面代码是什么意思?
int f(int x, int y)
{
return (x & y) + ((x ^ y) >> 1);
}
答:是求 x 和 y 的平均值。
为什么呢?
& 和 ^ 是位与运算和异或运算。
当 x 和 y 对应位相同时:对应位都为1, 则 1 位与 1,结果是 1,相当于是 (1+1)/ 2。
对应为都为0, 则 0 位与 0,结果是 0,相当于是 (0+0)/ 2。
当 x 和 y 对应位不同时:对应位分别是 1 和 0, 异或后,结果是 1, 右移一位,相当于除 2, 所以总体相当于是 (1 + 0)/ 2。
那么,函数 f 的意义就是:求平均值。
(3)用位运算实现两个整数的加法运算
int Add(int a, int b)
{
}
a 和 b 如果进行位与运算:那么位运算结果,如果为1,就代表进位,如果为0,就代表不进位。
可以把 a & b 作为进位与否的判定,进位为0,或者进位为1。
a 和 b 如果进行异或运算:运算结果是 没有加进位 的结果。
那么 上述两个步骤的结果再相加,即为最终加法运算结果。
int Add(int a, int b)
{
if (b == 0) return a; // 没有进位时,返回a
int num, jinWei;
num = a ^ b;
jinWei = (a & b) << 1; // 左移进位
return (num, jinWei);
}