链接:https://ac.nowcoder.com/acm/contest/11258/I
题目描述:
xay loves or. He gives you x and s, you need to calculate how many positive integer y satisfy x or y = s .
输入描述:
The first line contains two positive integers x and s .
It's guaranteed that 1≤x,s<2^31 .
输出描述:
Print the number of y satisfy x or y = s .
示例1
输入:
2 5
输出:
0
思路:
题目给定两个正整数x和s,根据公式x or y = s,计算有多少个正整数y符合条件。
or或运算,0 or 0 = 0,0 or 1 = 1,1 or 0 = 1,1 or 1 = 1。
所以,将给的两个正整数x和s转换成二进制,假设转换后第i个数分别是x[i],s[i],那么会有下面的四种情况:
1.x[i] = 0,s[i] = 0,那么相应地,y[i]只能是0。
2.x[i] = 0,s[i] = 1,那么相应地,y[i]只能是1。
3.x[i] = 1,s[i] = 0,此时不存在符合条件的数。
4.x[i] = 1,s[i] = 1,此时y[i]取0或1都可以。
那么只需要逐位进行判断即可,若有m位符合第4种情况,则y有2^m个符合条件。
可以直接计算cnt*2的累加和;也可以记录符合第4种情况的位数cnt,再计算pow(2,cnt)。
另外还需要特别注意,题目中规定了y是正整数,所以当y = 0时是不符合条件的,也就是仅当x = s时,会出现y = 0的情况。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int x,s;
cin >> x >> s;
int res = 1;
for(int i=0;i<=31;i++){
int a = (x>>i)&1; //>>右移1位,&与运算
int b = (s>>i)&1;
if(a==0 && b==0) continue; //第1种情况,x[i] = 0,s[i] = 0
if(a && b) res = res*2; //第4种情况,x[i] = 1,s[i] = 1
else if(a && b==0) res = 0; //第3种情况,x[i] = 1,s[i] = 0
else if(b && a==0) continue;//第2种情况,x[i] = 0,s[i] = 1
}
if(x == s) res--; //去掉y=0的情况
cout<<res;
return 0;
}