题目: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; }