整活
才发现自己又把位运算给忘了,完蛋玩意儿...
| 运算是两个位都为1才为1,其余都是0。
所以预处理一个包含maxn位的二进制数。从上向下取就完了,如果一个数是2^n^,那么与他 | 最大的肯定是2^n-1^,如果取不到那么肯定是往上取。然后看代码就行了...
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn 70
#define ll long long
ll bits[maxn];
int main(){
//初始化位数组
bits[0]=1;
for(int i=1;i<maxn;i++)//预处理所有2的n次方
bits[i]=bits[i-1]*2;
int n;
while(~scanf("%d", &n)){
while(n--){
ll l, r, ans, now;
scanf("%lld%lld", &l,&r);
ans=l;
now=0;
for(int i=maxn-1;i>=0;i--){//从高位向低位枚举
if((r&bits[i])!=0){
now+=bits[i];//这个向上取个人感觉挺不好理解
if(now-1>=l)
ans=max(ans,(now|now-1));
}
}
printf("%lld
", ans);
}
}
return 0;
}