求二進制數中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 }
相關文章
相關標籤/搜索