• 求二进制数中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 }
  • 相关阅读:
    超赞!不容错过的5款实用网页开发和设计工具
    如何从平面设计转行到UI设计?
    线段树
    RMQ
    Splay
    Treap
    *模板--矩阵
    最小生成树
    hash
    ac自动机
  • 原文地址:https://www.cnblogs.com/chuanlong/p/3702807.html
Copyright © 2020-2023  润新知