题目 最大的异或
B君和G君聊天的时候想到了如下的问题。
给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。
其中|表示按位或,即C、 C++、 Java中的|运算。
输入
包含至多10001组测试数据。
第一行有一个正整数,表示数据的组数。
接下来每一行表示一组数据,包含两个整数l,r。
保证 0 <= l <= r <= 10181018。
输出
对于每组数据输出一行,表示最大的位或。
样例输入
5
1 10
0 1
1023 1024
233 322
1000000000000000000 1000000000000000000
样例输出
15
1
2047
511
1000000000000000000
分析
①如果l和r的长度相同,从高位向低位遍历,找到第1个数位上不同的位置,从当前位一直到最低位都为1
②如果l和r的长度不同,说明两个数从第一位开始就不相同,同①
记得开longlong
代码
#include <cstdio>
#include <iostream>
using namespace std;
long long l, r;
long long sum;
int main(){
int T;
scanf("%d", &T);
while (T--){
sum = 0;
scanf("%lld%lld", &l, &r);
sum = r;
for (int i = 62; i >= 0; i--){
long long x = l & ((long long)1 << i);
long long y = r & ((long long )1 << i);
if (x ^ y){
for (int j = 0; j <= i; j++){
sum |= ((long long)1 << j);
}
break;
}
}
cout << sum << endl;
}
return 0;
}