题目

给定区间 ,求这个区间中任意选择两个(可以相同的)整数后异或的最大值。

解题思路

如果 相等,直接返回 0。

如果
判断 的最高位是否相等。
如果相同,则这个二进制位不会影响结果,因为从范围内任意选择两个数它们的高位都是这样,异或后相互抵消。
继续比较下一个高位,直到遇到 的高位 不同,此时 的高位是 1, 的高位是 0,答案是
因为,去掉相同的高位,那么范围内,肯定包含数 和数 ,它们异或后得到

例如,
它们二进制的第4位相同,这表示在它们范围之中的所有数的第4位都相同。
第一个不同的高位是第3位,则结果是
原因:去掉相同的高位后, 的有效位组成的数是 的有效位组成的数是 ,那么数 和数 肯定在范围内,而这两个数异或后的数是

C++代码

#include<iostream>
using namespace std;

int main(){
    int T;
    cin >> T;
    long long L, R;
    while(T--){
        cin >> L >> R;
        if(L==R){
            cout << 0 << endl;
            continue;
        }
        long long tmp = 1LL<<62;
        while((L&tmp) == (R&tmp)){
            tmp >>= 1;
        }
        tmp <<= 1;
        cout << tmp-1 << endl;
    }
    return 0;
}