2016-03-15 110 views
6

我需要做的是計算在一個無符號數的二進制表示中1的個數,使用遞歸函數的程序,所以這是我的代碼個1例如,我的代碼適用於編號7,但如果輸入號碼2,它將打印出其中包含2的號碼。而對於4,它返回0,我認爲對於所有2的指數,最後返回0。我無法弄清楚爲什麼。二進制數

+0

我會嘗試的第一件事是清理你的返回值等。你正在返回一個有符號的int,傳入一個無符號的東西?所以..理想情況下,當你進行按位操作時,保持所有內容不帶符號。你可以通過兩種方式做到這一點,但它可以更容易地知道你正在做你認爲你在做什麼......如果這是有道理的。作爲其中的一部分,你應該在兩行上都打印%u。讓我們知道,如果在將所有參數變爲無符號後,仍然存在問題 –

+0

嘗試過並得到相同的結果。 – Nebeski

+0

http://en.cppreference.com/w/c/language/operator_precedence –

回答

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; 
    } 
} 
+0

考慮到現在*計算*事物的速度,與存儲器訪問的緩慢性相比,我不確定這裏的性能,但這可能取決於緩存和使用模式,因此很難在此做出明確聲明。無論如何,對於替代品,人們可能想看看[Bit Twiddling Hacks](https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive),它提供了7種計算集合的方法位。 – Marco13

2

&操作符比+操作者,這將導致在else分支或one計算中產生錯誤的(在邏輯上)結果在較小的優先級。只是圍繞着它的括號,以確保它的第一個執行,你應該罰款:

return (n & 1) + one(n>>1); 
2

在這一行

return (n&1+one(n>>1)); 

操作+具有比&一個更高的優先級。但是,你必須先掩蓋最後一位,然後添加它:

return ((n&1) + one(n>>1));