如何在int变量中计数1

时间:2013-08-20 04:40:26

标签: c binary

如果我有一个int i = 15;,我知道二进制是0x00 00 00 0F0000 0000 0000 0000 0000 0000 0000 1111二进制有1

我想计算int变量中1的总和。

我写这个:

int count1(int i)
{
    int j = 0,num = 0;
    for(;j<32;j++)
        if((i<<j )&0x80000000)
            num++;
    return num;
}

它可以工作,但我认为它太慢了,我的意思是我可能有数百万int个数据。有些人有更有效的方法吗?

4 个答案:

答案 0 :(得分:2)

int countSetBits(int n)
{
    unsigned int count = 0;
    while (n)
    {
      n &= (n-1) ;
      count++;
    }
    return count;
}

这种对数字中的设置位进行计数的方法称为 Brian Kernighan的算法,其中循环将仅迭代到设置位的数量。即,在你的例子中,这将仅循环4次,不需要循环整个32次。

答案 1 :(得分:1)

int main() 
{ 

    int number = 15; 
    int sum; // total bits set in number
    for (sum = 0; number; sum++)
    {
      number &= number - 1; 
    }
    cout<<sum<<endl;
} 

答案 2 :(得分:0)

这应该有效:

int countOnes (int i) {

    int num = 0;
    while (i) {
        if (i % 2)
            num++;
        i = i >> 1;
    }

    return num;
}

答案 3 :(得分:0)

您可以继续修剪数字。我们假设二进制数存储在一个int变量bin中。

//此函数接受二进制值来计算其中有多少个。

int count(int bin)
{
    int num=0;
    while(bin>=1)
    {
        if(bin%10 == 1)
        {
            num++;
        }
        bin=bin/10;
    }
    return num;
}