题目内容
Vjudge链接
给出一个闭区间,找该区间内两个数,使这两个数的按位或最大。
输入格式
包含至多\(10001\)组测试数据。
第一行有一个正整数,表示数据的组数。
接下来每一行表示一组数据,包含两个整数\(l,r\)。
保证$ 0\le l\le r\le 10^{18}$。
输出格式
对于每组数据输出一行,表示最大的位或。
样例输入
样例输出
思路
使位或最大,就在范围内,使二进制数的1尽可能多就好了。最后求出1最多的数和右端点位或一下。
注意用位运算的时候要强制转long long。
代码
#include<cstdio>
using namespace std;
typedef long long ll;
int main(){
int T;
scanf("%d",&T);
while(T--){
ll a,b;
scanf("%lld%lld",&a,&b);
int pos=0;
while((a|((ll)1<<pos))<=b){
a|=((ll)1<<pos);
pos++;
}
printf("%lld\n",a|b);
}
return 0;
}