Description
Two positive integers a and b have a sum of s and a bitwise XOR of x. How many possible values are there for the ordered pair (a, b)?
Input
The first line of the input contains two integers s and x (2 ≤ s ≤ 1012, 0 ≤ x ≤ 1012), the sum and bitwise xor of the pair of positive integers, respectively.
Output
Print a single integer, the number of solutions to the given conditions. If no solutions exist, print 0.
Sample Input
9 5
4
3 3
2
5 2
0
Hint
In the first sample, we have the following solutions: (2, 7), (3, 6), (6, 3), (7, 2).
In the second sample, the only solutions are (1, 2) and (2, 1).
不懂位运算。。。。看不懂。。。渣渣还是先去研究一下位运算,再来看这道题吧。。。。。。先贴上别人的题解。。
- 异或相当于无进位的加法,s-x就是其各个位置的进位,比如s-x=1010,那就表示a和b的第1位和第3位发生的进位。
- 这样,对于某些位其值就能确定,对于有些位其值不能确定(该位xor和为1且没有发生进位),这时a和b的该位都能选择0或者1,对于不确定的就是乘法原理答案累乘2。
- 另外还有一些情况是不可能的,首先s<x不可能,s-x是奇数不可能,某一位xor和是1且发生了进位这不可能。
- 最后注意是正整数,而出现0只有s=x的情况,这时答案要减去2。
即 s = a + b = a xor b + ( a & b ) * 2;
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define LL long long
using namespace std;
int main()
{
LL a,b;
while(scanf("%I64d%I64d",&a,&b)!=EOF)
{
LL i,j;
LL ans=0;
if((a-b)>=0&&(a-b)%2==0)
{
LL wc=(a-b)/2;
int cut=0;
bool flag=true;
if(a==b)
ans-=2;
while(b)
{
if(b&1)
{
cut++;
if(wc&1)
{
flag=false;
}
}
if(!flag)
{
break;
}
b/=2,wc/=2;
}
if(!flag) ans = 0;
else ans += (1LL<<cut);
}
printf("%I64d\n",ans);
}
return 0;
}