C 以更快的方式找出变量中未设置的位

C 以更快的方式找出变量中未设置的位,c,embedded,C,Embedded,可能重复: 找出变量中设置的位数更容易。但我们如何用最快的方法执行相同的操作呢 上的本页介绍了几种计数位集数量的技术,并讨论了每种技术的性能。本页提供了各种建议。int i,size,set; int i, size, set; for (i = 1, size = sizeof(int) * 8; i <= size; i++) { if (value & (0 << 2 * i)) set++; } 对于(i=1,size=sizeof(int)

可能重复:

找出变量中设置的位数更容易。但我们如何用最快的方法执行相同的操作呢

上的本页介绍了几种计数位集数量的技术,并讨论了每种技术的性能。

本页提供了各种建议。

int i,size,set;
int i, size, set;
for (i = 1, size = sizeof(int) * 8; i <= size; i++)
{
    if (value & (0 << 2 * i)) set++;    
}

对于(i=1,size=sizeof(int)*8;i如果变量是整数,则可以使用

   public static int BitCount(int x)
        { return ((x == 0) ? 0 : ((x < 0) ? 1 : 0) + BitCount(x <<= 1)); }
公共静态int位计数(int x)

{return((x==0)?0:((x<0)?1:0)+位计数(x如果你问这个问题,那么gcc上的
\uuuu builtin\u popcount
至少和你当前做的一样快。uuuu builtin\u popcount通常在x86上会被打败,所以可能在其他CPU上也会被打败,但你不会说除了“嵌入式”之外,你的CPU是什么.这会影响答案


如果您不使用gcc,那么您需要查看如何在实际编译器和/或CPU上进行快速popcount。由于明显的原因,没有“在C中计算设置位的最快方法”。计算变量中的设置位被称为“填充计数”,简称为“popcount”

不同软件算法的非常好的微观基准如下:

AMD“巴塞罗那”处理器有一个快速的固定成本指令,在GCC中,您可以使用内置popcount获得该指令

在英特尔机箱上,我发现循环中的内置ffs最适用于稀疏位集


这是你不能依赖的东西;如果这对你很重要,你必须进行微基准测试。

我强烈建议阅读有关各种形式的位旋转的所有问题。特别是在计算位时,它会根据你可能获得的指令分析几种算法。

找到了一个重复的方法:什么方法您当前正在使用吗?如果您发布了您当前使用的代码,我们可以给您更多帮助。这可能是海报所指的幼稚方法,并要求更快的版本。幼稚并不意味着侮辱;它只是简单明了的方式,而且存在更快的聪明快捷方式(请参见其他答案中的比特旋转黑客)。这是不必要的迟钝,并且会比带有循环的简单实现慢。为什么要慢?左移位操作意味着它最多只递归变量中的位数,检查每个位一次,而且只检查一次。在我看来,这将与任何其他算法一样快或更快。过程调用不会根据编译器的设置,在另外十几条指令上确认设置和分解堆栈帧。