[英]Using recursion how can I count number of bits in an unsigned integer?
为什么此代码终止并崩溃以评估位数?
int main(void)
{
int y = 94;
int m = bitCount(y);
printf("%d",m);
return 0;
}
int bitCount(int val)
{
int i = 0;
if(!bitCount(val/2))
i++;
return i;
}
递归函数通过将问题分解为更小的部分来工作。 看来您正在尝试通过将问题除以2来将问题分解为更小的部分。这可以起作用,但是您必须牢记两点:
您必须计算两个部分的位数。 例如,如果您调用bitCount(val/2)
,那就很好:您刚刚在一个较小的问题上调用了bitCount()
,除了val
的最后一位。 但是,您刚刚扔掉的最后一点呢? 如果它是1,则必须计数。(提示: val%2
)。
您不能永远进行递归调用。 在这种情况下:如果val
小于2,则val/2
将为0,因此其中没有1位,因此无需调用bitCount(val/2)
即可发现。 因此,在这种情况下,您需要通过不调用bitCount
来“破坏递归”。
就像我说的那样,这是可行的,但是它并不是递归函数的一个很好的例子,因为“将其分解成较小的部分”是相当不平衡的。 该算法将进行递归调用,其数量与位数相同。 最后,它的时间复杂度与简单的线性算法大致相同(“大O”)。 理想情况下,您应根据位数而不是根据位数将数字分为两半。
换句话说,在您的示例中,二进制的94是1011110
,您正在将其分为两个子问题101111
和0
。 最好将其分解为1011
和110
。
我不知道这样做的简单方法。 以这种方式将数字一分为二可能与最初计算位数一样困难,因此几乎没有优势。 另一种可能性是,通过调用bitCount(val/16)
(等价于bitCount(val>>4)
)来折断每个低4位。
我做了一个简单的程序,您可以在其中数很多位,我假设您正在谈论1和0。 如果没有,那么我很傻:P
使用递归的bitCount函数:
int bitCount(unsigned int x, int count) {
if (n==0) return count;
if (n%2==1) bitCount(n/2,count+1);
else bitCount(n/2,count);
}
调用main函数:
int main() {
unsigned int x=94;
int counting = 0;
printf ("Result of bits: %d \n", bitCount(x,counting));
return 1;
}
使用unsigned int = 94时,它将返回5。我希望这是您想要的:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.