谷歌官方答案
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
size_t count_bit_one(int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
size_t count = count_bit_one(n);
printf("%d\n", count);
return 0;
}
其中的n&(n-1)值得思考应用!!
总结:
普通法
n & 1 得到 n 的最后一个数字,然后移位判断每一位数字。
比如 n = 250,n & 1 的结果前7位都是0,所以 n & 1 = n 的最后一位数字
250 11111010
1 00000001
// 普通法
int count1(unsigned int n) {
int count = 0;
while (n > 0) {
if ((n & 1) == 1) count++; // 判断n的二进制最后一位是不是1
n >>= 1; // 数据右移一位
}
return count;
}
int count0(unsigned int n) {
int count = 0;
while (n > 0) {
if ((n & 1) == 0) count++; // 判断n的二进制最后一位是不是1
n >>= 1; // 数据右移一位
}
return count;
}
快速法
快在不用逐个位比较,最后 count 值就是需要 while 循环的次数。原理如下:
n = n & (n - 1); // 1换0
n = n | (n + 1); // 0换1
比如 n = 7
n 7 0111
n-1 6 0110 n & (n - 1) = 0110
n+1 8 1000 n | (n + 1) = 1111
// 快速法
int count1(unsigned int n) {
int count = 0;
while (n > 0) { // 所有1都换成0跳出循环
n = n & (n - 1); // 1换0
count++;
}
return count;
}
int count0(unsigned int n) {
int count = 0;
while (n != 255) { // 所有0都换成1跳出循环
n = n | (n + 1); // 0换1
count++;
}
return count;
}