统计整型参数的值为1的二进制位的个数

来源:互联网 发布:mac隐藏菜单栏 编辑:程序博客网 时间:2024/06/05 14:48

统计整型参数的值为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、结果:
这里写图片描述

0 0