首页 > 其他 > 详细

【位运算】HDU 5969 最大的位或

时间:2020-05-05 13:47:51      阅读:76      评论:0      收藏:0      [点我收藏+]

题目内容

Vjudge链接
给出一个闭区间,找该区间内两个数,使这两个数的按位或最大。

输入格式

包含至多\(10001\)组测试数据。
第一行有一个正整数,表示数据的组数。
接下来每一行表示一组数据,包含两个整数\(l,r\)
保证$ 0\le l\le r\le 10^{18}$。

输出格式

对于每组数据输出一行,表示最大的位或。

样例输入

5
1 10
0 1
1023 1024
233 322
1000000000000000000 1000000000000000000

样例输出

15
1
2047
511
1000000000000000000

思路

使位或最大,就在范围内,使二进制数的1尽可能多就好了。最后求出1最多的数和右端点位或一下。
注意用位运算的时候要强制转long long。

代码

#include<cstdio>
using namespace std;
typedef long long ll;

int main(){
    int T;
    scanf("%d",&T);

    while(T--){
        ll a,b;
        scanf("%lld%lld",&a,&b);

        int pos=0;
        while((a|((ll)1<<pos))<=b){
            a|=((ll)1<<pos);
            pos++;
        }

        printf("%lld\n",a|b);
    }
    return 0;
}

【位运算】HDU 5969 最大的位或

原文:https://www.cnblogs.com/Midoria7/p/12830211.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!