题目
B君和G君聊天的时候想到了如下的问题。
给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。
其中|表示按位或,即C、 C++、 Java中的|运算。
Input
包含至多10001组测试数据。
第一行有一个正整数,表示数据的组数。
接下来每一行表示一组数据,包含两个整数l,r。
保证 0 <= l <= r <= 1018。
Output
对于每组数据输出一行,表示最大的位或。
Sample Input
5
1 10
0 1
1023 1024
233 322
1000000000000000000 1000000000000000000
Sample Output
15
1
2047
511
1000000000000000000
题解
解题思路
“|”表示按位或,其运算规则为
1 | 1 = 1;
1 | 0 = 1;
0 | 1 = 1;
0 | 0 = 0;
有1即为1。
求最大的位或,就要让每一位都尽量变成1
贪心即可完成
代码
#include <cstdio>
#define int long long
using namespace std;
int t, l, r;
signed main() {
scanf("%lld", &t);
while (t--) {
scanf("%lld%lld", &l, &r);
int x = 0;
while ((l | (long long)1 << x) < r)
l |= (long long)1 << x, x++;
printf("%lld
", l | r);
}
return 0;
}