将l和r转换成二进制数,那么将这两个数从高位往地位开始判断,如果相同,那么答案在这位上也是此值,如果不相等,那么答案在此为上为0,然后剩下的低位都为1。当然特殊情况就是当判断在某位不同时,r的剩下低位全是1,那么在此不同的位上也应该是1。
//841 ms 2300 KB
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define ll __int64
using namespace std;
ll s1[100007],s2[100007],s[100007];
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
ll l,r;
int num1=0,num2=0;
scanf("%I64d%I64d",&l,&r);
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
memset(s,0,sizeof(s));
while(l)
{
s1[num1++]=l%2;
l>>=1;
}
while(r)
{
s2[num2++]=r%2;
r>>=1;
}
ll ans=0;
int flag=0,i;
int num=max(num1,num2);
for(i=num-1; i>=0; i--)
{
if(s2[i]==s1[i])s[i]=s2[i];
else break;
}
for(int k=i; k>=0; k--)
{
s[k]=1;
if(!s2[k])flag=1;
}
if(flag)s[i]=0;
ll aa=1;
for(int k=0; k<num; k++,aa*=2)
ans+=s[k]*aa;
printf("%I64d\n",ans);
}
return 0;
}