现在的位置: 首页 > 综合 > 正文

求整数n的二进制表达式中1的个数

2013年07月01日 ⁄ 综合 ⁄ 共 1433字 ⁄ 字号 评论关闭

题目看过不少次,写起来也不难,最近才发现还有很多我以前没有想到的优雅方案

关于这个的解法,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);
}

第一、第二种,我也能想到,第三种,花了我不少时间才看懂,还有更难理解的,就不贴了,有兴趣的自己去看 (下载不了~~~ 郁闷)

 

抱歉!评论已关闭.