最大的位或 ——位运算

题目

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\n", l | r);
    }
    return 0;
}
posted @ 2020-05-07 08:39  Shawk  阅读(269)  评论(0编辑  收藏  举报