zoukankan      html  css  js  c++  java
  • 最大的位或 ——位运算

    题目

    B君和G君聊天的时候想到了如下的问题。
    给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。
    其中|表示按位或,即C、 C++、 Java中的|运算。

    Input

    包含至多10001组测试数据。
    第一行有一个正整数,表示数据的组数。
    接下来每一行表示一组数据,包含两个整数l,r。
    保证 0 <= l <= r <= 1018。

    Output

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

    Sample Input

    5
    1 10
    0 1
    1023 1024
    233 322
    1000000000000000000 1000000000000000000
    

    Sample Output

    15
    1
    2047
    511
    1000000000000000000
    

    题解

    解题思路

    “|”表示按位或,其运算规则为

    1 | 1 = 1;
    1 | 0 = 1;
    0 | 1 = 1;
    0 | 0 = 0;
    

    有1即为1。
    求最大的位或,就要让每一位都尽量变成1
    贪心即可完成

    代码

    #include <cstdio>
    #define int long long 
    using namespace std;
    int t, l, r;
    signed main() {
        scanf("%lld", &t);
        while (t--) {
            scanf("%lld%lld", &l, &r);
            int x = 0;
            while ((l | (long long)1 << x) < r)
                l |= (long long)1 << x, x++;
            printf("%lld
    ", l | r);
        }
        return 0;
    }
    
  • 相关阅读:
    常用英语1000句
    TXT EXPLORER
    窗体美化
    C++ Code_StatusBar
    C++ Code_Slider
    C++ Code_ScrollBar
    C++ Code_ImageList
    C++ Code_HotKey
    C++ Code_animateCtrl
    C++ CheckMenuItem
  • 原文地址:https://www.cnblogs.com/shawk/p/12840466.html
Copyright © 2011-2022 走看看