UVALive 6918 And Or(位运算)

来源:互联网 发布:工信部大数据认证 编辑:程序博客网 时间:2024/05/22 13:55

题目地址 :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;}