题目地址 :https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4930
位运算的一道题。
A |(A+1)|(A+2)|…..B 的最终值为A和B二进制位从高到低遇到第一个不相同的位时,后面全部取1的二进制所得的值。同理 A&(A+1)&(A+2)&………B的最终值为后面全部取0所得二进制转化为十进制的值。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
int main()
{
int n;
int kase = 0;
scanf("%d", &n);
while(n--)
{
long long int x, y;
scanf("%lld %lld", &x, &y);
long long int tmp1;
tmp1 = 1l;
tmp1 <<= 62;
while(((tmp1 & x) == (tmp1 & y)) && tmp1)//从long long int 最高位开始, 判断x, y的每一位二进制位是否相同, 不相同时退出循环
{
tmp1 >>= 1;
}
long long int _and = 0;
long long int _or = 0;
while(tmp1)//从不同的二进制位开始,tmp1的全部位取1, 然后与y按位或即可得到第一个答案
{
_or |= tmp1;
tmp1 >>= 1;
}
long long int ans1 = (y | _or);
_and = ~_or;//全部取反,与y按位与得到第二个答案
long long int ans2 = (x & _and);
printf("Case %d: %lld %lld\n", ++kase, ans1, ans2);
}
return 0;
}