统计整型参数的值为1的二进制位的个数
1、讨论来源:
The C programming Language
2、代码:
#include <stdio.h>
#include <stdlib.h>
int bitCount(unsigned int n)
{
int i=0;
for(;n;n>>=1)
{
if(n&1)
{
++i;
}
}
return i;
}
int bitCountFast(unsigned int n)
{
int i=0;
for(;n;n&=(n-1))
{
++i;
}
return i;
}
int main()
{
int n;
scanf("%d",&n);//输入要计算的值
printf("bitCount:\t%d\n",bitCount(n));
printf("bitCountFast:\t%d\n",bitCountFast(n));
printf("Hello world!\n");
return 0;
}
3、总结:
A、
将x 声明为无符号类型是为了保证将x 右移时,无论该程序在什么机器上运行,左边空出的位都用0(而不是符号位)填补。
B、
表达式x &= (x – 1)可以删除x中最右边值为1 的一个二进制位
C、上述引用都来自该书。对于bitCount()函数很正常,对于bitCountFast()函数,很明显加快了程序进行,时间复杂度明显减小。循环次数取决于二进制位1的个数,而bitCount()函数取决于UINT的位数。
D、表达式x &= (x – 1),(x – 1)每次将最右边的1变为0,紧邻右边0变为1,如100B-1B=011B,这样得来,每次表达式的执行就使得该x少了一个二进制位1。
4、结果: