最近在网上找到计算一个整数中的位是1或是0的个数的快速算法, 这个算法比常规的算法快很多倍(4倍以上)。由于这个算法在搜索引擎中经常用到,可能在其它应用上也会用到, 所以贴上去与大家共享。其中的代码如下:
其中uncom_count是所指的快速算法
其中com_count 是所指的一般算法
// dd.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Windows.h"
static inline int uncom_count(unsigned x) {
x = x - ((x >> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
x = (x + (x >> 4)) & 0x0F0F0F0F;
x = x + (x >> 8);
x = x + (x >> 16);
return x & 0x0000003F;
}
static inline int com_count(unsigned x)
{
int count=0;
int i;
for (i=0;i<32;i++)
if (x & (1<<i)) count++;
return count;
}
int main(int argc, char* argv[])
{
unsigned the_number = 15;
int count = 1000000;
unsigned start_time = GetTickCount();
for( int i = 0; i < count; i++)
{
uncom_count (the_number);
}
fprintf(stderr, "time_consumbed by uncom_count = %d ms/n", GetTickCount() - start_time);
fprintf(stderr, "bitcount = %d /n", uncom_count(the_number));
start_time = GetTickCount();
for(i = 0; i < count; i++)
{
com_count (the_number);
}
fprintf(stderr, "time_consumbed by com_count = %d ms/n", GetTickCount() - start_time);
fprintf(stderr, "bitcount = %d /n", uncom_count(the_number));
return 0;
}