题目:XOR
来源:哈尔滨理工大学软件与微电子学院程序设计竞赛(同步赛)

解题思路

假设存在一个正整数数列 1,2,3,···,N - 1,N,从中选出两个数(两个数可以相同),使它们异或后的值最大吗?异或后的最大值是多少?

要使异或后的值最大,那么异或后的值的二进制表示中 1 要位于高位且 1 要尽可能多,
其中 1 能达到的最高位取决于 N 的二进制表示中 1 所处的最高位。

例如,N = 9,其二进制表示为 0b1001。
1 能达到的最高位是第 4 位,选取 0b1000,该数一定小于等于 N。
剩下的 3 位补 1,为 0b0111,该数一定小于等于 N。
两个数异或得 0b1111。

当 N = 1 时,两个数都只能为 1,异或后为 0。

C++代码

#include<iostream>
using namespace std;

int main(){
    long long N;
    cin >> N;
    if(N == 1){
        cout << 0 << endl;
        return 0;
    }
    long long a = 1;
    while(N){
        N >>= 1;
        a <<= 1;
    }
    --a;
    cout << a << endl;
    return 0;
}