要让异或后的值尽量大,那就应该让两个数的对于位置的值尽量不一样
从l,r的最高位开始看,如果相同,那异或之后就是0了,因此直接不考虑
继续往后面的位置看,当他们不一样的时候,一定是l当前位为0,r当前为1
假如当前是第i位,那么l一定小于2^i,并且之后的每一位,都可以在异或后得到1
所以,直接把l,r异或,然后将每一位都改成1就是最终答案了
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <cmath>
#define ll long long
#define pi 3.1415927
#define inf 0x3f3f3f3f
#define mod 1000000007
using namespace std;
#define _int __int128_t
inline ll read()
{
ll x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=getchar();
return f*x;
}
void print(ll x)
{
if(x < 0) {putchar('-');x = -x;}
if(x/10) print(x/10);
putchar(x%10+'0');
}
ll n,m;
int main ()
{
ll T,i,t,j,k,p,sum=0;
cin>>T;
while(T--)
{
j=read(); k=read();
p=j^k;
sum=0;
while(p){
p>>=1;
sum=sum<<1|1;
}
cout<<sum<<endl;
}
return 0;
}
京公网安备 11010502036488号