一串bit流中统计1的个数
同事说了个方法很不错,学习了。
#pragma once
#include<iostream>
typedef unsigned char byte;
#define NEW_LINE "\r\n";
const static int bitMapSize=256;
byte bitMap[bitMapSize];
void InitBitMap(void)
{
bitMap[0]=0; //初始化第一个表值 0000 0000
int nowBitStart=0,nowStart=1,nowLength=2;
//根据第一个表值生成后面的所有表值
for(;nowLength<=bitMapSize;nowLength*=2)
{
for(;nowStart<nowLength;)
{
bitMap[nowStart++]=bitMap[nowBitStart++]+1;
}
nowStart=nowLength;
nowBitStart=0;
}
}
//计算byte流中1的个数
long CaculateBitCount(byte *byteFlow,long flowSize)
{
long bitCounter=0;
for(long i=0;i<flowSize;)
{
bitCounter+=long(bitMap[int(byteFlow[i++])]);
}
return bitCounter;
}
int main()
{
InitBitMap();
int test=14589526; //0000 0000 1101 1110 1001 1110 0101 0110 15个1
std::cout<<CaculateBitCount((byte *)(&test),sizeof(test))<<NEW_LINE;
std::cin.get();
return 0;
}
bitmap算法:
http://www.cnblogs.com/donj/archive/2010/08/29/1811906.html