此题解由fffngzzh所写
做出这道题需要我们了解计算机进行加法计算的原理
两个数字加起来时,需要解决两个问题:
众所周知,计算机是以二进制来储存数字的,所以样例(1+2=3)在计算机眼里就像这样(四位):
0001
+0010
------
0011
我们再观察几个:(2+2=4)
0010
+0010
------
0100
大家或许已经发现了什么东西:
第一个数字的当前位为1,第二个数字的当前位为0时,结果的当前位为1
第一个数字的当前位为1,第二个数字的当前位也为1时,结果的当前位为0
第一个数字的当前位为0,第二个数字的当前位也为0时,结果的当前位为0
我们知道“异或”运算的规则:
1^0=0
1^1=0
0^0=0
你看这不是一模一样吗?
只有两个数字的当前位都为1时,才会往下一位进位
而“且”运算的规则:
1&1=1
1&0=0
0&0=0
这不也是一样的吗?
讲到这里,大家应该都会了吧
#include<bits/stdc++.h>
using namespace std;
int main(){
long long a,b,t;//t另有别用
scanf("%lld%lld",&a,&b);
while(b!=0){//b不是零说明不需要进位了
t=a;//先将a当前的值用t存起来
a^=b;//先算出结果的每一位是什么
b&=t;//判断是否要进位
b<<=1;//由于进位是要给下一位的,所以往左移一位
}
printf("%d\n",a);
return 0;
}