HDU5969 最大的位或

整活

才发现自己又把位运算给忘了,完蛋玩意儿...

| 运算是两个位都为1才为1,其余都是0。

所以预处理一个包含maxn位的二进制数。从上向下取就完了,如果一个数是2^n^,那么与他 | 最大的肯定是2^n-1^,如果取不到那么肯定是往上取。然后看代码就行了...

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn 70
#define ll long long
ll bits[maxn];
int main(){
    //初始化位数组
    bits[0]=1;
    for(int i=1;i<maxn;i++)//预处理所有2的n次方
        bits[i]=bits[i-1]*2;
    int n;
    while(~scanf("%d", &n)){
        while(n--){
            ll l, r, ans, now;
            scanf("%lld%lld", &l,&r);
            ans=l;
            now=0;
            for(int i=maxn-1;i>=0;i--){//从高位向低位枚举
                if((r&bits[i])!=0){
                    now+=bits[i];//这个向上取个人感觉挺不好理解
                    if(now-1>=l)	
                        ans=max(ans,(now|now-1));
                }
            }
            printf("%lld
", ans);
        }
    }
    return 0;
}