要让异或后的值尽量大,那就应该让两个数的对于位置的值尽量不一样
从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; }