首先我们先看5和7相加。
a 5 二进制 101
b 17 二进制 10001
a+b 22二进制 10100
第一步:让a^b得到 10100 与a+b答案相比没有算进位
第二步:让a&b得到 00001 (a&b)<<1 ) 得到00010记录进位 原因:因为只有1+1会产生进位,1+0,0+0,0+1均不会产生进位这时我们发现这刚好符合(a&b)<<1的性质
第三步:让((a&b)<<1 )^(a^b)就相当于进位 ,然而这样又会产生进位,因此就重复循环。直到进位为0结束。
给出代码如下:
#include<stdio.h>
#include<stdlib.h>
int Add(int a, int b)
{
int sum = 0;
int count = 0;
do{
sum = a^b;
count = (a&b) << 1;//进位
a = sum;
b = count;
}
while (b != 0);
return sum;
}
int main()
{
int ret=Add(3, 9);
printf("%d", ret);
system("pause");
return 0;
}