如果我有一个int i = 15;
,我知道二进制是0x00 00 00 0F
,0000 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
个数据。有些人有更有效的方法吗?
答案 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;
}