A little girl loves problems on bitwise operations very much. Here's one of them.
You are given two integers l and r. Let's consider the values of for all pairs of integers a and b (l ≤ a ≤ b ≤ r). Your task is to find the maximum value among all considered ones.
Expression means applying bitwise excluding or operation to integers x and y. The given operation exists in all modern programming languages, for example, in languages C++ and Java it is represented as "^", in Pascal — as «xor».
The single line contains space-separated integers l and r (1 ≤ l ≤ r ≤ 1018).
Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64dspecifier.
In a single line print a single integer — the maximum value of for all pairs of integers a, b (l ≤ a ≤ b ≤ r).
1 2
3
8 16
31
1 1
0
题意: 给定l和r, 求l-r之间的两个数x,y, 使得x^y有最大值.
分析: 贪心的思想, 从高位开始枚举, 当某一位l和r的二进制位不一样的时候, 那么这一位就肯定可以选到1, 让x这一位取1, y这一位取0, x后面的位全部取0,y后面的为全部取1, 两者异或就会出现二进制位上全部是1的最大值, 而且x跟y不会超范围, 这点举几个例子就看出来了.
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=100010,MOD=1e9+7;
int main()
{
ll a,b;
cin>>a>>b;
int i=61;
for(;i>=0;i--)
{
if((a&(1LL<<i)) ^ (b&(1LL<<i))) break;
}
ll ans=0;
for(;i>=0;i--) ans |= 1LL<<i;
cout<<ans;
return 0;
}