1. 两个数异或,相当于每一位相加,而不考虑进位;
2. 两个数相与,并左移一位,相当于求得这两个数相加的进位;
3. 一个数n与其减一的数相与(即n&(n-1)),等价于去掉最左边的1
如n=10二进制为1010,n&(n-1)=1000
应用以上技巧可以解决一些算法题:
下面是剑指offer上的一道题:

class Solution {
public:
int Add(int num1, int num2)
{
int sum=num1,sub=0;
while(num2!=0)
{
sum=num1^num2;
sub=(num1&num2)<<1;
num1=sum;
num2=sub;
}
return sum;
}
};
完美应用上面第一条和第二条技巧。
再比如:

class Solution {
public:
int NumberOf1(int n) {
int count=0;
while(n)
{
++count;
n=n&(n-1);
}
return count;
}
};
非常的简单实用!!!
本文介绍位运算中的异或、与运算及其在算法题中的应用,包括不使用加法运算符实现两数相加及计算整数二进制中1的个数的方法。

3万+

被折叠的 条评论
为什么被折叠?



