题目链接:http://codeforces.com/problemset/problem/485/C
题意:给出两个数,找出这两个数之间二进制表达1个数最多的数,如果有两个数他们所含有的1的个数相同则输出数值较小的数。
思路:将两个数中较小的那个数的二进制表示中的0位从右往左依次变成1直到大于较大的那个数为止,然后就能得到答案了。
code:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
LL cal(LL a,LL b)
{
LL ans;
int la=0,lb=0;
LL mida=a,midb=b;
while(midb!=0){
lb++;
midb=midb>>1;
}
ans=a;
for(int i=0;i<lb;i++){
if((a>>i)&1) continue;
if(ans+(1LL<<i)<=b) ans+=(1LL<<i);
else break;
}
return ans;
}
int main()
{
int nn;
LL l,r;
cin>>nn;
while(nn--){
cin>>l>>r;
cout<<cal(l,r)<<endl;
}
return 0;
}