二进制数中1的个数
Number of 1s in a binary number
我需要编写一个程序来计算无符号数的二进制表示中 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
,它是 returns 0,我认为对于 2 的所有指数,它最终是 returns 0。我不明白为什么。
&
运算符的优先级低于+
运算符,这导致else
分支或one
中的计算产生错误(逻辑上)结果。只需用括号将其括起来以确保它首先执行,您应该没问题:
return (n & 1) + one(n>>1);
主要问题在这里:
return (n&1+one(n>>1));
加法运算符 +
运算符的优先级高于按位与运算符 &
。所以表达式实际上是:
return (n & ( 1 + one(n >> 1)));
您需要在 n&1
周围添加括号:
return ((n & 1) + one(n >> 1));
编辑:
作为编程练习,这很好用。在实际代码中,预先计算的查找 table 效率更高。
// 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;
}
}
在这一行
return (n&1+one(n>>1));
运算符 +
的优先级高于 &
。但是,你必须先屏蔽最后一位,然后添加它:
return ((n&1) + one(n>>1));
我需要编写一个程序来计算无符号数的二进制表示中 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
,它是 returns 0,我认为对于 2 的所有指数,它最终是 returns 0。我不明白为什么。
&
运算符的优先级低于+
运算符,这导致else
分支或one
中的计算产生错误(逻辑上)结果。只需用括号将其括起来以确保它首先执行,您应该没问题:
return (n & 1) + one(n>>1);
主要问题在这里:
return (n&1+one(n>>1));
加法运算符 +
运算符的优先级高于按位与运算符 &
。所以表达式实际上是:
return (n & ( 1 + one(n >> 1)));
您需要在 n&1
周围添加括号:
return ((n & 1) + one(n >> 1));
编辑:
作为编程练习,这很好用。在实际代码中,预先计算的查找 table 效率更高。
// 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;
}
}
在这一行
return (n&1+one(n>>1));
运算符 +
的优先级高于 &
。但是,你必须先屏蔽最后一位,然后添加它:
return ((n&1) + one(n>>1));