zoukankan      html  css  js  c++  java
  • 最大的位或----(极简代码)

    Describe

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

    Input

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

    Output

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

    Sample Input

    5
    1 10
    0 1
    1023 1024
    233 322
    1000000000000000000 1000000000000000000
    

    Sample Output

    15
    1
    2047
    511
    1000000000000000000
    

    Solution

    位运算记得转long long

    这道题的规律很简单,不要想复杂了,我们就是让下限由低位开始,尽可能的每位变为1(二进制),一直到<=上限为止,不过可能最高位的0变为1时会超出上限,例如上限00100100,下限00010000,下限变为00011111后,再一位变1就超了上限,上限为b的话,所以结果应该是现在的00011111|b(以保证最高位的1能取到).

    代码很简单

    Code

    #include <cstdio>
    typedef long long LL;
    LL a,b;
    int t;
    int main(){
    	scanf("%d",&t);
    	while(t--){
    		scanf("%lld%lld",&a,&b);
    		int now=0;
    		while((a|((LL)1<<now))<=b){
    			a|=((LL)1<<now);
    			now++;
    		}
    		printf("%lld
    ",a|b);
    	}
    	return 0;
    }
    
  • 相关阅读:
    《完美应用ubuntu》之全面管理ubuntu软件源
    ubuntu下安装CAJ阅读器
    re正则表达式方法
    Xpath做数据解析
    C++异常处理
    异常处理
    指针与引用
    总结:开放透明的环境对于大数据团队的重要性
    java控制流
    3. 最小生成树
  • 原文地址:https://www.cnblogs.com/Lour688/p/12840724.html
Copyright © 2011-2022 走看看