计算一个整数中的位是1或是0的个数的快速算法

来源:互联网 发布:网络通信面试 编辑:程序博客网 时间:2024/05/21 14:02

最近在网上找到计算一个整数中的位是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;

}

原创粉丝点击