HWOJ 查找输入整数二进制中1的个数
题目:查找输入整数二进制中1的个数
题目分析:
思路一:
利用位运算来做,所以我们不需要把输入的十进制转化为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; }