题目
给定区间 ,求这个区间中任意选择两个(可以相同的)整数后异或的最大值。
解题思路
如果 与
相等,直接返回 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; }