首页 > 代码库 > 求二进制数中1的个数

求二进制数中1的个数

问题:对于一个字节(8bit)的无符号整形变量,求二进制表示中“1”的个数,要求算法的执行效率尽可能高。
 1 #include <iostream>
 2 using namespace std;
 3 //最简单的思路,除2有余数
 4 int fun1(unsigned int a)
 5 {
 6     int count;
 7     count = 0;
 8     while (a)
 9     {
10         if (a % 2)
11             count++;
12         a /= 2;
13     }
14     return count;
15 }
16 //用位操作更快,但是时间复杂度仍为二进制的长度
17 int fun2(unsigned int a)
18 {
19     int count;
20     count = 0;
21     while (a)
22     {
23         //if (a & 1)
24             //count++;
25         count += a & 1;
26         a = a>>1;
27     }
28     return count;
29 }
30 //O(2)直接给答案,最快,但是空间复杂度会比较高
31 int fun3(unsigned int a)
32 {
33     int count;
34     count = 0;
35     int result[20] = {0, 1, 1, 2,
36                       1, 2, 2, 3,
37                       1, 2, 2, 3,
38                       2, 3, 3, 4};
39     while (a)
40     {
41         count += result[a & 15];
42         a = a >> 4;
43     }
44     return count;
45 }
46 //这方法想不起来了,时间复杂度跟二进制中1的个数有关,比前二种方法高效,相比第三种方法,没有用到多余的空间
47 int fun4(unsigned int a)
48 {
49     int count;
50     count = 0;
51     while (a)
52     {
53         a &= (a - 1);
54         count ++;
55     }
56     return count;
57 }
58 int main()
59 {
60     unsigned int a, b;
61     a = 11;
62     b = 63;
63     //测试
64     cout<<fun1(a)<<endl;
65     cout<<fun2(a)<<endl;
66     cout<<fun3(a)<<endl;
67     cout<<fun4(a)<<endl;
68 
69     cout<<fun1(b)<<endl;
70     cout<<fun2(b)<<endl;
71     cout<<fun3(b)<<endl;
72     cout<<fun4(b)<<endl;
73     system("pause");
74     return 0;
75 }