http://acm.hdu.edu.cn/showproblem.php?pid=5969
要使或的和最大,要尽可能的让高位为1。将l和r两个数的二进制形式写出来,缺的补0,每一位都对齐,由于l<=r,所以在不相等的情况下,一定会出现某一位,r这一位上是1,而l这一位上是0,这样,我们可以选择一个数x这一位是1,往后所有都是0,y这一位是0,往后所有都是1,这样选择的x,y一定满足要求,而且x|y最大。
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
long long x,y,ans;
int xx[1000],yy[1000],zz[1000];
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>x>>y;
if(x==y)
{
cout<<x<<endl;
continue;
}
for(int i=0;i<64;i++)
{
xx[64-i-1]=x%2;
x/=2;
yy[64-i-1]=y%2;
y/=2;
}
int pos;
for(int i=0;i<64;i++)
{
if(xx[i]!=yy[i])
{
pos=i;
break;
}
}
for(int i=0;i<pos;i++)
zz[i]=xx[i];
for(int i=pos;i<64;i++)
zz[i]=1;
ans=0;
for(int i=0;i<64;i++)
ans=ans*2+zz[i];
cout<<ans<<endl;
}
return 0;
}