Algorithm 计算1';是整数吗?
可能重复:Algorithm 计算1';是整数吗?,algorithm,optimization,numbers,compiler-optimization,Algorithm,Optimization,Numbers,Compiler Optimization,可能重复: 给定一个32位无符号整数,我们要计算其二进制表示中非零位的数量。最快的方法是什么 我们想这样做N~10^10次 注意:由于当前cpu的体系结构,使用大型查找表通常不是一个好主意。本地计算要比使用需要查看外部内存的巨大数组快得多实际上有几种选择,我认为本地方法对此太慢了 您可以使用查找表查找8位值,并对unsigned int value的所有四个字节并行执行,然后对结果求和。这一个也可以很好地并行化(无论是多核,或者甚至一些SSE3/4都可以提供帮助) 您也可以使用Brian Ke
给定一个32位无符号整数,我们要计算其二进制表示中非零位的数量。最快的方法是什么 我们想这样做N~10^10次
注意:由于当前cpu的体系结构,使用大型查找表通常不是一个好主意。本地计算要比使用需要查看外部内存的巨大数组快得多实际上有几种选择,我认为本地方法对此太慢了 您可以使用查找表查找8位值,并对unsigned int value的所有四个字节并行执行,然后对结果求和。这一个也可以很好地并行化(无论是多核,或者甚至一些SSE3/4都可以提供帮助) 您也可以使用Brian Kernighan的解决方案:
unsigned int v; // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v
for (c = 0; v; c++)
{
v &= v - 1; // clear the least significant bit set
}
不久前我在某处发现的最后一种可能的方法是(在64位机器上,因为那里的模运算非常快):
unsigned int v; // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v
c = ((v & 0xfff) * 0x1001001001001ULL & 0x84210842108421ULL) % 0x1f;
c += (((v & 0xfff000) >> 12) * 0x1001001001001ULL & 0x84210842108421ULL) % 0x1f;
c += ((v >> 24) * 0x1001001001001ULL & 0x84210842108421ULL) % 0x1f;