整数的二进制表示中的零的数量

可能重复:
计算32位整数中设定位数的最佳算法?

给定一个32位整数N,设计一个算法来找出N的二进制位表示中零的个数。

我能想到的最简单的算法是检查零点的二进制表示,用C语言来表示:

int num_of_zero(int num)
 {
   if(0 == num) return 1; /*For the input 0 it should output 1 */
   int Count = 0;
   while(num>0){
     if(0 == (num&1)) Count++;
    num >>= 1;
}
return Count;
}

如果有一些算法需要在固定的时间进行计算,那么我正在游荡。

对于输入0,它应该返回1 而不是32

对于5 ,输出应该是1.因为二进制表示是101

对于7 ,输出应该是0。

准确地说,我正在寻找一种更好的算法来计算32位整数的二进制解释中的(非前导)零的数量。希望现在这个问题已经很清楚了。

编辑:正如Alex Martelli指出的那样,delroth正在修改我的代码,使其更具可读性并使用迭代。


这样做的简单方法是遍历数字的二进制表示的每一位,测试每个位的值,并计算其中有多少为零。 循环会比递归更清晰。

尽管如此,还有很多优化的方法。 你可以在这个问题的答案中找到一些更好的答案,“计算32位整数中设定位数的最佳算法”(显然,零位数是从总数中减去设定位数)的位)。


网上有一个很棒的资源叫做Bit Twiddling Hacks,它包含了各种各样的C技巧。 您可能对Counting位设置部分特别感兴趣。


快速和愚蠢的方式 - 在重复问题中有更多异国情调的实现,但是我在过去使用了类似的东西,没有太多不良影响。

我们在这里使用一个半字节表来减少循环的运行次数 - 如果你正在做这些计算的一小部分,建立一个更大的阵列可能更有效率,比如在字节级别上,切割循环运行一半。

/* How many bits are set in every possible nibble. */
static size_t BIT_TABLE[] = {
    0, 1, 1, 2,     /* 0, 1, 2, 3 */
    1, 2, 2, 3,     /* 4, 5, 6, 7 */
    1, 2, 2, 3,     /* 8, 9, A, B */
    2, 3, 3, 4      /* C, D, E, F */
};

size_t num_of_bits(int num) {
    /* Little reworking could probably shrink the stack space in use here. */
    size_t ret = 0, i;
    register int work = num;

    /* Iterate every nibble, rotating the integer in place. */
    for(i = 0; i < (sizeof(num) * 2); i++) {
        /* Pointer math to get a member of the static array. */
        ret += *(BIT_TABLE + (work & 0xF));
        work >>= 4;
    }
    return ret;
}
链接地址: http://www.djcxy.com/p/72581.html

上一篇: Number of Zeros in the binary representation of an Integer

下一篇: counting number of ones in binary representation of a number