我需要做的是計算在一個無符號數的二進制表示中1的個數,使用遞歸函數的程序,所以這是我的代碼個1例如,我的代碼適用於編號7
,但如果輸入號碼2
,它將打印出其中包含2
的號碼。而對於4
,它返回0,我認爲對於所有2的指數,最後返回0。我無法弄清楚爲什麼。二進制數
Q
二進制數
6
A
回答
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));
相關問題
- 1. 如何將數字(十進制)轉換爲二進制(二進制)數字和從二進制到十進制?
- 2. 十進制到二進制(二進制)
- 3. 整數二進制
- 4. 二進制數據
- 5. 二進制計數
- 6. 二進制數組
- 7. 二進制數據
- 8. 計數二進制
- 9. 將二進制數字轉換爲二進制數字
- 10. 基數的二進制補碼二進制數
- 11. 拆分以二進制個位數2個位數二進制
- 12. 帶分數的二進制數的二進制補碼
- 13. 減去不同長度的二進制數的二進制數
- 14. 二進制十進制負數位集
- 15. 十進制和二進制數處理
- 16. 十進制素數到二進制
- 17. 十進制數的二進制補碼
- 18. 二進制INT二進制字符
- 19. 如何將數組編碼爲二進制並將二進制數據解組到二進制數組中?
- 20. 用二進制補碼查找二進制數,C
- 21. 寫的字符串二進制數據的二進制文件
- 22. 小數二進制減法
- 23. 集羣二進制數據
- 24. 二進制數據和GWT
- 25. ASCII轉二進制函數
- 26. ODataController和二進制數據
- 27. 檢索二進制數據
- 28. 模式二進制數據
- 29. Stuck扣除二進制數
- 30. 提取二進制數據
我會嘗試的第一件事是清理你的返回值等。你正在返回一個有符號的int,傳入一個無符號的東西?所以..理想情況下,當你進行按位操作時,保持所有內容不帶符號。你可以通過兩種方式做到這一點,但它可以更容易地知道你正在做你認爲你在做什麼......如果這是有道理的。作爲其中的一部分,你應該在兩行上都打印%u。讓我們知道,如果在將所有參數變爲無符號後,仍然存在問題 –
嘗試過並得到相同的結果。 – Nebeski
http://en.cppreference.com/w/c/language/operator_precedence –