我需要使用递归函数创建一个计算无符号数的二进制表示中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。我无法弄清楚原因。
答案 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));