在区间【L,R】内找到两个数,使得他们的异或值最大。
思路:
①我们从高位开始贪心即可,如果两个数L,R的2进制位数长度不同,设定R的2进制长度为x的话,那么答案一定是(1<<x)-1;因为我们可以让R除了最高位之外,都变成0,让L所有位子都变成1.并且长度为x-1.
②否则,如果两个数长度相等且部分前边高位数值一样的话,我们忽略不计,只找最高位不同的位子即可。
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
#define ll __int64
int main()
{
ll l,r;
while(~scanf("%I64d%I64d",&l,&r))
{
for(ll i=60;i>=-1;i--)
{
if(i==-1||((l>>i)^(r>>i)))
{
printf("%I64d\n",((1ll<<(i+1))-1));
break;
}
}
}
}