ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

不要0!我们需要1!

2026/8/25 14:41:27 拓冰建站 浏览量
不要0!我们需要1!

解法一:

十进制转二进制同时数1的个数

#include<iostream>
#define endl '\n'
using namespace std;
void solve(int x) {int cnt = 0;while (x) {if (x % 2 == 1) cnt++;x /= 2;}cout << cnt << endl;
}
int main() {int n;cin >> n;solve(n);return 0;
}

解法二:

位运算

#include<iostream>
#define endl '\n'
using namespace std;
void solve(int x) {int cnt = 0;while (x) {cnt += x & 1;x >>= 1;}cout << cnt << endl;
}
int main() {int n;cin >> n;solve(n);return 0;
}

使用x&1来取得最低位的数,右移再循环取值,直至最高位的1

解法三:

同位运算

#include<iostream>
#define endl '\n'
using namespace std;
void solve(int x) {int cnt = 0;while (x) {x = x & (x - 1);cnt++;}cout << cnt << endl;
}
int main() {int n;cin >> n;solve(n);return 0;
}

对任意的x,二进制的表示是形如这样的数字:**...**100...00,从右往左是任意多的0,**表示1左边任意0或1,对x-1得到**...**011...11,x&(x-1)相当于消去了从右往左的第一个1,循环直至消去全部1.