题目:请实现一个函数,输入一个整数,输出该二进制整数中表示1的个数。例如把9表示成二进制是1101,有2位是1。因此如果输入9,该函数输出2。
思路:我们不能忽视一个明显而不可争辩的事实,一个整数减去1都是把最右边的1那一位开始到结束的所有位取反,而它左边所有位保持不变。那如果是减一之后的结果和原整数本身相与,会发生什么?
结果为该整数最右边的1变成0,其它位不变,相当于从整数中提取出一个1,如果1提取完了,结果就变成0了。
#include<stdio.h>
/*
**统计二进制中1的个数。
*/
int
NumberOf1(int n)
{
int count = 0;
while (n) {
++count;
/*
**每次相与后的结果是原整数最右边的1变成0,
**其它位不变。
*/
n = (n - 1)&n;
}
return count;
}
int main() {
/*
**测试用例的输入是负数。
*/
int n = -16, count = 0;
count = NumberOf1(n);
printf("%d中1(二进制表示)的个数:\n",n);
printf("%d\n", count);
return 0;
}
本程序在VS2017下运行通过。