1000 - A+B Problem

此题解由fffngzzh所写

做出这道题需要我们了解计算机进行加法计算的原理

两个数字加起来时,需要解决两个问题:

  1. 结果的每一位是什么
  2. 是否需要进位

众所周知,计算机是以二进制来储存数字的,所以样例(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;
}