簡體   English   中英

在二進制字中找到1的最有效方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM