题目看过不少次,写起来也不难,最近才发现还有很多我以前没有想到的优雅方案
关于这个的解法,http://wenku.baidu.com/view/81dfec47be1e650e52ea99e0.html 中还有很多,不少看不懂,下面是我看得懂而且比较喜欢的:
#include <cstdio>
unsigned int get_count_1(unsigned int x)
{
unsigned int n = 0;
while (0 != x)
{
x &= x - 1;
n += 1;
}
return(n);
}
struct stu_bit
{
unsigned char bit0 : 1;
unsigned char bit1 : 1;
unsigned char bit2 : 1;
unsigned char bit3 : 1;
unsigned char bit4 : 1;
unsigned char bit5 : 1;
unsigned char bit6 : 1;
unsigned char bit7 : 1;
};
unsigned int get_count_byte(unsigned char * px)
{
if (NULL == px)
{
throw "px is null";
}
stu_bit * psx = reinterpret_cast<stu_bit *>(px);
return(psx->bit0 + psx->bit1 + psx->bit2 + psx->bit3 +
psx->bit4 + psx->bit5 + psx->bit6 + psx->bit7);
}
unsigned int get_count_2(unsigned int x)
{
unsigned char * px = reinterpret_cast<unsigned char *>(&x);
unsigned int n = 0;
for (int i = 0; i < sizeof(x)/sizeof(*px); ++i)
{
n += get_count_byte(px + i);
}
return(n);
}
unsigned int get_count_3(unsigned int x)
{
static unsigned int m1 = 0x55555555;
static unsigned int m2 = 0x33333333;
static unsigned int m4 = 0x0f0f0f0f;
static unsigned int m8 = 0x00ff00ff;
static unsigned int m16 = 0x0000ffff;
x = (x & m1) + ((x >> 1) & m1);
x = (x & m2) + ((x >> 2) & m2);
x = (x & m4) + ((x >> 4) & m4);
x = (x & m8) + ((x >> 8) & m8);
x = (x & m16) + ((x >> 16) & m16);
return(x);
}
int main(int argc, char * argv[])
{
unsigned int x = 0xffffffff;
unsigned int count_1 = get_count_1(x);
unsigned int count_2 = get_count_2(x);
unsigned int count_3 = get_count_3(x);
printf("count of %d is %d\n", x, count_1);
printf("count of %d is %d\n", x, count_2);
printf("count of %d is %d\n", x, count_3);
return(0);
}
第一、第二种,我也能想到,第三种,花了我不少时间才看懂,还有更难理解的,就不贴了,有兴趣的自己去看 (下载不了~~~ 郁闷)