32位int整型数的二进制表示中1的个数

来源:互联网 发布:国税数据质量整改 编辑:程序博客网 时间:2024/05/16 15:20

前段时间遇到这个题,现在记录几个实现方法。

1,第一个最直观的方法,用一个二进制表示只有1个1的数字去测试整型数的各个位置是否为1:,直接上代码:

int bit_count_1(int num){    int flag = 0x1;    int count = 0;    for (int i = 0; i < 32; ++i)    {        if (0 != (num & flag))        {            ++count;        }        flag = flag << 1;    }    return count;}

2,第二个方法,注意到一个整型数n,与n-1相与,其结果将是n的为1的最低位变为0,利用这个特点,可以有算法为:每次判断n是否为0,不为0则说明n中至少有1个1,随后将n=n&(n-1),这样可以去掉n中最低位的那个1,然后继续循环。代码很简单,如下:

int bit_count_2(int num){    int count = 0;    while (0 != num)    {        ++count;        num = num & (num - 1);    }    return count;}

3,第三个方法,可以先设置一个数组,第n个元素的值就是n的二进制表示中1的个数,假设有记录所有4bit整数的这样一个数组,则对于32位整型数,则将该32位整数分为8块,统计各块的1的个数之和即得到完整的32位整型数中的1的个数,具体的看代码就 清楚了:

int bit_num[] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};int bit_count_3(int num){    return (bit_num[num & 0xf] + bit_num[(num >> 4) & 0xf] +        bit_num[(num >> 8) & 0xf] + bit_num[(num >> 12) & 0xf] +        bit_num[(num >> 16) & 0xf] + bit_num[(num >> 20) & 0xf] +        bit_num[(num >> 24) & 0xf] + bit_num[(num >> 28) & 0xf]);}

还有许多其他算法,再次先不研究了~

0 0
原创粉丝点击