#include <cmath>
#include <iostream>
using namespace std;
int main() {
/*
对于任意一个数x
将其转为2进制 1010 0011 ... 1101
可将其与这个数异或 0101 1100 ... 0010
得到 1111 1111 ... 1111
这个结果由x的二进制的位数决定
对于二进制位数相同的数(如4 5 6),得到的结果相同
在长度为n的排列中,n为二进制位数最多的数字之一
我们可以对n进行这个操作,得到最大的数,就是所求的值m
先求log2(n),将结果加1得到n的二进制位数up
2^up-1即为所求m
*/
unsigned long long n;
cin >> n;
int up = 0;
up = (int) log2(n) + 1;
// (1ULL<<up) 即2^up,ULL为unsigned long long,用于防止溢出
cout << (1ULL<<up) -1;
}
// 64 位输出请用 printf("%lld")

京公网安备 11010502036488号