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

时间:2011-09-22 11:01:48

标签: c++ algorithm bit-manipulation

我不确定这样的东西会被称为什么,(因此笨拙的标题),但我需要这样的东西来处理我正在做的事情。我无法用言语形容它,但我希望这张图能为我解释:

Binary question picture thing

在这个例子中,当任意“索引”(例如5)之后的所有内容都被忽略时,获取“on-bits”数量的最快方法是什么?

4 个答案:

答案 0 :(得分:5)

首先执行input &= 0xfffffff8(或输入类型的等效项)以清除最右边的三个位。然后是take your pick from here

答案 1 :(得分:5)

除了已经说过的内容之外,我想提醒你注意许多编译器提供的内置popcnt可能比手动更快(然后再次,也许不是,请务必测试它) )。它们的优点是可能编译为单个popcnt操作码,如果它在你的目标架构中可用(但我听说它们在回到库函数时做了愚蠢的慢事),而你很幸运,如果编译器检测到其中一个来自Sean的bithacks集合的算法(但它可能)。

对于msvc,它是__popcnt(和变体),对于gcc它是__builtin_popcount(和变体),对于OpenCL(好吧你没有要求,但为什么不把它扔进去)它是popcnt但你必须启用cl_amd_popcnt。

答案 2 :(得分:3)

如下所示:

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)重置的有些模糊的事实 低阶位。

答案 3 :(得分:2)

查找表将在固定时间内为您提供此信息。