求整数的位模式中包含几个1。
//
//
#include <iostream>
#include <assert.h>
#include <algorithm>
#include <hash_set>
#include <vector>
#include <string>
#include <assert.h>
#include <time.h>
using namespace std;
// O(n)
int bitCount(int x)
{
int sum=0;
while (x)
{
x &= (x-1);
sum++;
}
return sum;
}
// O(logn)
int bitCount2(int x)
{
x=((x&0xAAAAAAAA)>>1)+(x&0x55555555);
x=((x&0xCCCCCCCC)>>2)+(x&0x33333333);
x=((x&0xF0F0F0F0)>>4)+(x&0x0F0F0F0F);
x=((x&0xFF00FF00)>>8)+(x&0x00FF00FF);
return x;
}
int main()
{
int i,x;
time_t ib,ie;
int N=1000;
// bitCount
ib=clock();
while (N--)
{
for (i=0; i<10000; i++)
{
x=bitCount(i);
}
}
ie=clock();
cout<<"bitCount: "<<ie-ib<<" ms"<<endl;
// bitCount2
N=1000;
ib=clock();
while (N--)
{
for (i=0; i<10000; i++)
{
x=bitCount2(i);
}
}
ie=clock();
cout<<"bitCount: "<<ie-ib<<" ms"<<endl;
// check
for (i=0; i<50; i++)
{
cout<<i<<" bitCount(i) = "<<bitCount(i)<<" bitCount2(i) = "<<bitCount2(i)<<endl;
}
return 0;
}
本文介绍两种计算整数位模式中1的数量的方法:一种时间复杂度为O(n),通过循环将当前数与减1后的数进行按位与运算;另一种时间复杂度为O(logn),利用位操作技巧减少计算步骤。同时,对比了这两种方法的运行效率。

被折叠的 条评论
为什么被折叠?



