最大的位或----(极简代码)

Describe

B君和G君聊天的时候想到了如下的问题。
给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。
其中|表示按位或,即C、 C++、 Java中的|运算。

Input

包含至多10001组测试数据。
第一行有一个正整数,表示数据的组数。
接下来每一行表示一组数据,包含两个整数l,r。
保证 0 <= l <= r <= 10181018。

Output

对于每组数据输出一行,表示最大的位或。

Sample Input

5
1 10
0 1
1023 1024
233 322
1000000000000000000 1000000000000000000

Sample Output

15
1
2047
511
1000000000000000000

Solution

位运算记得转long long

这道题的规律很简单,不要想复杂了,我们就是让下限由低位开始,尽可能的每位变为1(二进制),一直到<=上限为止,不过可能最高位的0变为1时会超出上限,例如上限00100100,下限00010000,下限变为00011111后,再一位变1就超了上限,上限为b的话,所以结果应该是现在的00011111|b(以保证最高位的1能取到).

代码很简单

Code

#include <cstdio>
typedef long long LL;
LL a,b;
int t;
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%lld%lld",&a,&b);
		int now=0;
		while((a|((LL)1<<now))<=b){
			a|=((LL)1<<now);
			now++;
		}
		printf("%lld\n",a|b);
	}
	return 0;
}
posted @ 2020-05-07 08:50  liuzhaoxu  阅读(212)  评论(0编辑  收藏  举报