Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 计算1';是整数吗?_Algorithm_Optimization_Numbers_Compiler Optimization - Fatal编程技术网

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;