簡體   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