zoukankan      html  css  js  c++  java
  • 最大的异或

    题目 最大的异或

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

    输入

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

    输出

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

    样例输入

    5
    1 10
    0 1
    1023 1024
    233 322
    1000000000000000000 1000000000000000000
    

    样例输出

    15
    1
    2047
    511
    1000000000000000000
    

    分析

    ①如果l和r的长度相同,从高位向低位遍历,找到第1个数位上不同的位置,从当前位一直到最低位都为1

    ②如果l和r的长度不同,说明两个数从第一位开始就不相同,同①

    记得开longlong

    代码

    #include <cstdio>
    #include <iostream>
    using namespace std;
    long long  l, r;
    long long sum;
    int main(){
    	int T;
    	scanf("%d", &T);
    	while (T--){
    		sum = 0;
    		scanf("%lld%lld", &l, &r);
    		sum = r;
    		for (int i = 62; i >= 0; i--){
    			long long x = l & ((long long)1 << i);
    			long long y = r & ((long long )1 << i);
    			if (x ^ y){
    				for (int j = 0; j <= i; j++){
    					sum |= ((long long)1 << j);
    				}
    				break;
    			}
    		}
    		cout << sum << endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    使用GitLab搭建Git仓库
    SpringBoot web开发
    springboot配置
    springboot自动配置原理
    springboot修改端口号
    springboot创建方式
    junit运行多个测试的方法
    junit常用注解
    junit断言
    sublime将.m文件关联MATLAB类型高亮
  • 原文地址:https://www.cnblogs.com/ghosh/p/12837794.html
Copyright © 2011-2022 走看看