首先是找出来它们两个的二进制表达式,尽可能给长的补更多的1。
所以 从高位到低位依次找,找到不同的之后,全部都是1.
第一次写分情况,最后样例没错,也没发现拿错了。
后来仔细推推发现一种情况就行了。 才发现了一个错误,我计算二进制的值之这样写的(2<<i) 这样写 会爆LL ,
所以最后改成(LL)pow(2,i)。
代码如下:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int main(){
int t;
LL m,n;
int a[111],b[111];
scanf("%d",&t);
while(t--){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%lld%lld",&m,&n);
LL l=m,r=n,lenl=0,lenr=0;
while(l){
a[lenl++]=l%2;
l/=2;//printf("%d",a[lenl-1]);
}//printf("\n");
while(r){
b[lenr++]=r%2;//printf("%d",b[lenr-1]);
r/=2;
}LL ans=0;//printf("\n");
for(int i=lenr-1;i>=0;i--){
if(a[i]==b[i]){
if(b[i])
ans+=(LL)pow(2,i);
}else{
ans+=(LL)pow(2,i+1)-1;
break;
}
}
printf("%lld\n",ans);
}
return 0;
}