数组中的位数

时间:2010-05-02 19:18:09

标签: algorithm

我知道要计算一个数字中的设置位数,可以使用以下代码:

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;
}

然而,这不起作用。有什么问题?

1 个答案:

答案 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);

为了避免在使用此代码获取数组中的总位数时引入错误的可能性,您可以将其作为单独的函数保留,并在数组中为每个元素调用一次。这将简化代码。