XOR
题解
易知:从1
到N
,若数字N
本身二进制位不全为1
一定存在数字k
与N异或后得到二进制位全为1
。
举个例子:从0到4
4:100
3:011
2:010
1:001
0:000
那么我们要做的就是输出这个二进制位全为1的数字。
AC代码
代码1
#include <bits/stdc++.h>
//#pragma GCC optimize(2)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ull unsigned long long
#define ll long long
#define rep(i, x, y) for(int i=x;i<=y;i++)
#define mms(x, n) memset(x, n, sizeof(x))
#define pre(i, x, y) for(int i = x; i >=y; i--)
#define INF (0x3f3f3f3f)
#define mod (1e9+7)
using namespace std;
int main() {
ll n;
cin >> n;
if (n==1) cout << 0;
else {
ll a = 1;
while (a <= n) {
a *= 2;
}
cout << a-1;
}
return 0;
}
代码2
#include <bits/stdc++.h>
//#pragma GCC optimize(2)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ull unsigned long long
#define ll long long
#define rep(i, x, y) for(int i=x;i<=y;i++)
#define mms(x, n) memset(x, n, sizeof(x))
#define pre(i, x, y) for(int i = x; i >=y; i--)
#define INF (0x3f3f3f3f)
#define mod (1e9+7)
using namespace std;
int main() {
ll n;
cin >> n;
if (n==1) cout << 0;
else {
ll a = 1;
while(n) {
n >>= 1;
a <<= 1;
}
cout << a-1;
}
return 0;
}