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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值