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;
}
};
非常的简单实用!!!