问题:对于一个字节(8bit)的无符号整形变量,求二进制表示中“1”的个数,要求算法的执行效率尽可能高。
1 #include2 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< <