最大的异或

题目 最大的异或

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;
}
posted @ 2020-05-06 17:38  ghosh  阅读(195)  评论(0编辑  收藏  举报
莫挨老子!