我知道要计算一个数字中的设置位数,可以使用以下代码:
int t; // in which we want count how many bits are set
// for instance, in 3 (011), there are 2 bits set
int count=0;
while (t > 0) {
t &= (t - 1);
count++;
}
现在是一个数组示例:
int x[] = {3, 5, 6, 8, 9, 7};
我有以下代码:
int sum = 0;
int count;
for (int i = 0; i < x.length; i++) {
count = 0;
while (x[i] > 0){
x[i] &= (x[i] - 1);
count++;
}
sum += count;
}
然而,这不起作用。有什么问题?
答案 0 :(得分:2)
你的代码对我来说很好,除了长度未定义 - 也许是因为你使用的是Java,而不是我最初猜到的C.无论如何,我让它在C中工作:
#include <stdio.h>
int main()
{
int x[]={3,5,6,8,9,7};
int sum=0;
int count;
for (int i=0;i<6;i++){
count=0;
while (x[i]>0){
x[i]&=(x[i]-1);
count++;
}
sum+=count;
}
printf("%d\n", sum);
}
输出:
12
一种更简单的方法是在循环中进行位移,并在经过时计算位数。
count = 0;
while (t)
{
count += t & 1;
t >>= 1;
}
这个page显示了一些更高级的算法,包括使用查找表或聪明的并行算法。您正在使用的方法在该页面上称为“Brian Kernighan的方式”。
您还可以看到编译器提供的内容,例如:
int __builtin_popcount (unsigned int x);
为了避免在使用此代码获取数组中的总位数时引入错误的可能性,您可以将其作为单独的函数保留,并在数组中为每个元素调用一次。这将简化代码。