最大的异或

Posted ghosh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大的异或相关的知识,希望对你有一定的参考价值。

题目 最大的异或

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;
}





以上是关于最大的异或的主要内容,如果未能解决你的问题,请参考以下文章

[Leetcode421](python): 数组中两个数之间最大的异或值

紫色的手链(求最大值和次大值的异或值最大)

0x16 Tire之最大的异或对

POJ3764 The xor-longest Path

洛谷 [P4151] 最大异或和路径

P4735 最大异或和