HWOJ 查找输入整数二进制中1的个数

来源:互联网 发布:产品经理mac软件 编辑:程序博客网 时间:2024/05/20 14:17

HWOJ 查找输入整数二进制中1的个数

题目:查找输入整数二进制中1的个数

Alt text

题目分析:
思路一:
利用位运算来做,所以我们不需要把输入的十进制转化为2进制;
直接先将n 与 1进行位运算,这样检测最右边的数是不是为1,之后将n右移动一位,直到n不为0
思路二:
由于思路一有两个弊端,①是时间比较长 ②如果为输入为负数的时候就不正确,所以我们尽量不右边移动输入数字i,我们首先与1与以下,判断最低次位是不是1,接着把1左移一位得到2再和i做位运算,就能判断次高位是不是1,这样反复左移,每次总能判断i的其中一位是不是1.
学习笔记:
位运算比乘除法好,效率高

==============================================================================
参考代码1:

    //查找输入整数二进制1的个数.cpp    //2014.07.06    #include <iostream>    #include <time.h>    using namespace std;    int findNumberOf1(int n)    {        int count = 0;        while(n)        {            if(n & 1)                count ++;            n = n >> 1;         }        return count;    }    int main()    {        int n;        cin >> n;        cout << findNumberOf1(n) << endl;        cout << (double)clock() / CLOCKS_PER_SEC;        return 0;    }

注意:这里我加了time.h头文件测其时间,因为这个再华为OJ测试说时间超过了。

参考代码2:

//查找输入整数二进制1的个数.cpp//2014.07.06#include <iostream>#include <time.h>using namespace std;int findNumberOf1(int n){    int count = 0;    unsigned int flag = 1;    while(flag)    {        if(n & flag)            count ++;        flag = flag << 1;     }      return count;}int main(){    int n;    cin >> n;    cout << findNumberOf1(n) << endl;    cout << (double)clock() / CLOCKS_PER_SEC;    return 0;}
0 0