在不使用查找表的情況下,在UInt32中計數設置位數(即計數1的次數)的最快方法是什麼?有沒有一種方法可以計算O(1)?什麼是在C#中的UInt32中計數設置位的最快方法?
3
A
回答
5
bit-twiddling hacks頁面有許多選項。
當然,你可能會說,遍歷所有32位可能爲O(N),在每一次:)
爲了簡單,它是同樣的成本,我會考慮的查找表,per-字節的方法,或迭代,因爲有位設置很多次,我想作爲寫布賴恩Kernighan的整潔的想法:
public static int CountBits(uint value)
{
int count = 0;
while (value != 0)
{
count++;
value &= value - 1;
}
return count;
}
如果你不喜歡填充256條目查找表的想法,每查找一個nybble仍然會很快。請注意,有可能8個數組查找可能比32個簡單位操作慢。
當然,在進入特別深奧的方法之前,測試應用程序的真實性能是值得的...這對你來說真的是一個瓶頸嗎?
+0
這看起來更具可讀性,但我仍然想知道像這樣計數位的用法是什麼。如果我不得不猜測,我會說它可能用於密碼學。 – Alisson
10
是一個重複: how-to-implement-bitcount-using-only-bitwise-operators 或 best-algorithm-to-count-the-number-of-set-bits-in-a-32-bit-integer
而且有對這個問題許多解決方案。我使用的是:
int NumberOfSetBits(int i)
{
i = i - ((i >> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}
相關問題
- 1. 什麼是在Ruby的NArray中總結設置位的最快方法?
- 2. 在C++中設置編碼的最正確方法是什麼?
- 3. 在C#中計算數組頻率分佈的最快方法是什麼?
- 4. 最快的方法來計算間隔的設置位數
- 5. 在MATLAB中做這種計算的最快方法是什麼?
- 6. 在C++中比較向量的最快方法是什麼?
- 7. 在C中旋轉bmp圖像的最快方法是什麼?
- 8. 在位掩碼中設置位的正確方法是什麼?
- 9. 計算素數列表中數字位置的最佳方法是什麼?
- 10. 在datagridview中設置SELECTEDROWS列的值的最快方法是什麼?
- 11. 比較Python3中散列位的最快方法是什麼?
- 12. 常用lisp中計算階乘的最快方法是什麼?
- 13. 設置光標/插入位置的最佳方法是什麼?
- 14. 什麼是計算32的冪對數的最快方法?
- 15. 設置DOMElement界限的最快方法是什麼?
- 16. 什麼是計算存儲數字所需位數的最快方法
- 17. 什麼是在Python中過濾整數表的最快方法?
- 18. 在桶中查找數字的最快方法是什麼?
- 19. 在Matlab中加載數據的最快方法是什麼?
- 20. Android:找到設備當前位置的最快方法是什麼
- 21. 什麼是最快的Android SDK設置?
- 22. 在C++中創建統一的隨機數的最快方法是什麼?
- 23. 什麼是計算e到2萬億位數的最快方法?
- 24. wp8 c#中計算駕駛距離的最快方法是什麼?
- 25. 在Game Center中設置highScore最簡單的方法是什麼?
- 26. 在VB.net中保存設置的最簡單方法是什麼
- 27. 在j2me中存儲設置的最佳方法是什麼?
- 28. 在C中重置char []的最佳方法是什麼?
- 29. 什麼是c中最快的循環?
- 30. 在XDocument中定位和設置元素值的最有效方法是什麼?
看看[這篇文章]的答案(http://stackoverflow.com/questions/109023/best-algorithm-to-count-the-number-of-set-位式-A-32位整數)。 – Batuu