本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题意:
给你两个数x,s,问你有多少个数or上x等于s。
思路:
当x==s时,答案为2的x的二进制位上1的个数次方-1. 否则寻找x的二进制位为1而s的二进制位为1的次数cnt,并判断是否存在x的二进制位为0而s的二进制位为1的情况,若有,则答案为pow(2,cnt)-1,否则为pow(2,cnt)。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[1000];
int res[110];
int main()
{
ll x,s;
int cnt = 0;
cin>>x>>s;
ll xx=x,ss=s;
while(x)
{
a[++cnt] = x%2;
x=x>>1;
}
int num = 0;
while(s)
{
res[++num] = s%2;
s=s>>1;
}
ll ans = 0;
ll sum = 0;
int flag = 0;
for(int i = 1; i <= cnt; i++)
{
if(a[i])
{
if(res[i])
{
ans++;
}
else
{
cout<<0<<endl;
return 0;
}
}
else
{
if(res[i])flag = 1;
}
}
for(int i = 1; i <= num; i++)
if(!a[i] &&res[i])
{
flag = 1;
break;
}
ll p = (ll)pow(2,ans);
if(a[1]&&res[1] && !flag)sum = 1;
if(xx==ss)cout<<p-1<<endl;
else
cout<<p-sum<<endl;
}