0

如果我有一个,int i = 15;我知道它是0x00 00 00 0F二进制的,是二进制的0000 0000 0000 0000 0000 0000 0000 11114 1

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

我写这个:

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

它可以工作,但我认为它太慢了,我的意思是也许我有数百万int数据。有人有更有效的方法来做到这一点吗?

4

4 回答 4

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

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

于 2013-08-20T05:14:15.107 回答
1
int main() 
{ 

    int number = 15; 
    int sum; // total bits set in number
    for (sum = 0; number; sum++)
    {
      number &= number - 1; 
    }
    cout<<sum<<endl;
} 
于 2013-08-20T04:53:42.160 回答
0

这应该有效:

int countOnes (int i) {

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

    return num;
}
于 2013-08-20T04:53:17.973 回答
0

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

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

int count(int bin)
{
    int num=0;
    while(bin>=1)
    {
        if(bin%10 == 1)
        {
            num++;
        }
        bin=bin/10;
    }
    return num;
}
于 2013-08-20T04:53:53.803 回答