整数的二进制数表达中有多少个1
题目描述
给定一个32位整数n,返回该整数二进制形式1的个数。
输入描述:
输入一个整数,代表n,n为32为整数。
输出描述:
输出一个整数,代表n的二进制表达式中1的个数。
示例1
输入
1
输出
1
示例2
输入
-2
输出
31
备注:
时间复杂度 O ( 1 ) O(1) O(1),额外空间复杂度 O ( 1 ) O(1) O(1)。
题解:
若按位进行枚举,则需要枚举32位,效率略微有点低。我们可以只考虑 1 的位,有两种方法可以取得二进制最右边为 1 的位:
- n & (n - 1)
- n & (~n + 1)
两种方法均可以取得 n 的二进制表示中最右边为 1 的位,然后将这个 1 去掉,继续处理剩下的,直到所有的 1 处理完毕即可。
代码:
#include <cstdio>
using namespace std;
int main(void) {
int n;
scanf("%d", &n);
int num = 0;
while (n) {
++num;
//n &= (n - 1);
n -= n & (~n + 1);
}
return 0 * printf("%d\n", num);
}