繁体   English   中英

使用递归如何计算无符号整数中的位数?

[英]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来将问题分解为更小的部分。这可以起作用,但是您必须牢记两点:

  1. 您必须计算两个部分的位数。 例如,如果您调用bitCount(val/2) ,那就很好:您刚刚在一个较小的问题上调用了bitCount() ,除了val的最后一位。 但是,您刚刚扔掉的最后一点呢? 如果它是1,则必须计数。(提示: val%2 )。

  2. 您不能永远进行递归调用。 在这种情况下:如果val小于2,则val/2将为0,因此其中没有1位,因此无需调用bitCount(val/2)即可发现。 因此,在这种情况下,您需要通过不调用bitCount来“破坏递归”。

就像我说的那样,这是可行的,但是它并不是递归函数的一个很好的例子,因为“将其分解成较小的部分”是相当不平衡的。 该算法将进行递归调用,其数量与位数相同。 最后,它的时间复杂度与简单的线性算法大致相同(“大O”)。 理想情况下,您应根据位数而不是根据位数将数字分为两半。

换句话说,在您的示例中,二进制的94是1011110 ,您正在将其分为两个子问题1011110 最好将其分解为1011110

我不知道这样做的简单方法。 以这种方式将数字一分为二可能与最初计算位数一样困难,因此几乎没有优势。 另一种可能性是,通过调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM