二进制数中的1的数量

时间:2016-03-15 17:36:01

标签: c recursion bit-manipulation

我需要使用递归函数创建一个计算无符号数的二进制表示中1的个数的程序,所以这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int one(unsigned n);

int main()
{
    unsigned n;
    printf("n= "); scanf("%u", &n);
    printf("%d", one(n));

    printf("\n");
    return 0;
}

int one(unsigned n)
{
    if(n==1 || n==0)
        return n;
    else
        return (n&1+one(n>>1));
}

事情是,我的代码适用于数字7,但是如果我输入数字2,则会打印出其中有2个数字。对于4,它返回0,我认为对于所有2的指数,它最终返回0。我无法弄清楚原因。

3 个答案:

答案 0 :(得分:2)

&运算符的优先级低于+运算符,这会导致else分支或one中的计算产生错误(逻辑)结果。只需用括号括起来,确保它首先被执行,你应该没问题:

return (n & 1) + one(n>>1); 

答案 1 :(得分:2)

主要问题在于:

    return (n&1+one(n>>1));

加法运算符+运算符的优先级高于按位运算符&。所以表达是有效的:

    return (n & ( 1 + one(n >> 1)));

您需要在n&1附近添加括号:

    return ((n & 1) + one(n >> 1));

编辑:

作为编程练习,这很好用。在现实生活中的代码中,预先计算的查找表效率更高。

// Assumes CHAR_BITS == 8

int numbits[256] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
                   ...
                     4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 };

int count_bits(unsigned n)
{
    int i, count = 0;
    for (i=0; i<sizeof(n); i++) {
        count += numbits[(uint8_t)(n & 0xFF)];
        n >>= 8;
    }
}

答案 2 :(得分:2)

在这一行

return (n&1+one(n>>1));

运营商+的优先级高于&。但是,您必须首先屏蔽最后一位,然后添加它:

return ((n&1) + one(n>>1));