[英]Most efficient way to find 1s in a binary word?
我不確定會有什么樣的東西會被稱為(因此笨拙的標題),但我需要這樣的東西來處理我正在做的事情。 我無法用言語形容它,但我希望這張圖能為我解釋:
在這個例子中,當任意“索引”(例如5)之后的所有內容都被忽略時,獲得“on-bits”數量的最快方法是什么?
首先input &= 0xfffffff8
(或輸入類型的等效項)來清除最右邊的三個位。 然后從這里拿走你的選擇 。
除了已經說過的內容之外,我還想提醒你注意許多編譯器都提供了一個內置的popcnt,它可能比手動更快(然后再說一次,也許不是,一定要測試它)。 它們的優點是可能編譯為單個popcnt操作碼,如果它在你的目標架構中可用(但我聽說它們在回到庫函數時做了愚蠢的慢事),而你很幸運,如果編譯器檢測到其中一個來自Sean的bithacks集合的算法(但它可能)。
對於msvc,它是__popcnt (和變體),對於gcc它是__builtin_popcount(和變體),對於OpenCL(好吧你沒有要求它,但為什么不把它扔進去)它是popcnt但你必須啟用cl_amd_popcnt。
類似於以下內容:
int
countOnes( unsigned value, int top )
{
assert( top >= 0 && opt < CHAR_BIT * sizeof( unsigned ) );
value &= ~(~0 << top);
int results = 0;
while ( value != 0 ) {
++ results;
value &= value - 1;
}
return results;
}
這取決於i & (i - 1)
重置低位的有些模糊的事實。
查找表將在恆定時間內為您提供此信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.