题意:n(1 ≤ n ≤ 10000) 组数据,每组一个l, r(0 ≤ li ≤ ri ≤ 10^18),求[l, r]间二进制表示1最多的,最小的数。
题目链接:http://codeforces.com/problemset/problem/484/A
——>>如果 l 与 r 的二进制位数不一样,那么此时应达全1状态近 r。。
如果 l 与 r 的进制数位数一样的时候,从较小数不断加各个位置的 1 ,不超过 r 得到的数就是结果。。
1LL.。。。。。。。
#include <cstdio>
int Cal(long long x)
{
int ret = 0;
while (x)
{
++ret;
x >>= 1;
}
return ret;
}
int main()
{
int n;
long long l, r, ret;
scanf("%d", &n);
while (n--)
{
scanf("%I64d%I64d", &l, &r);
int lcnt = Cal(l);
int rcnt = Cal(r);
if (lcnt < rcnt)
{
if (r == (1LL << rcnt) - 1)
{
ret = r;
}
else
{
ret = (1LL << (rcnt - 1)) - 1;
}
}
else
{
for (int i = 0; i < rcnt; ++i)
{
if (((1LL << i) | l) <= r)
{
l |= (1LL << i);
}
}
ret = l;
}
printf("%I64d\n", ret);
}
return 0;
}