《算法营02》
实现输入一个整数,输出该数二进制中表示1的个数
本题共三种方法,推荐第三种。
方法一:
令1从最低位开始&运算,每次左移一个位置,若&运算结果 == 1 便使 count 加 1,最后输出count的值即可(虽然整数为32位,最高位运算36次,但为了节省时间,先将输入的整数除以二,所得结果即为需要&运算的最多次数)
代码:
#include <iostream>
using namespace std;
int main()
{
system("color F0");
int n, count = 0;
cout << "请输入需要判断的整数:" << endl; cin >> n ; //获取输入的整数
for(int i = 0; i <= n/2; i++)
{
if((n & (1 << i)) == (1 << i))count++;
}
cout << "整数" << n << "二进制中1的个数为:" << count << endl;
system("pause");
return 0;
}
测试运行结果如图:
方法二:
原理同方法一,只不过让&运算的1不动,而让整数的二进制每次右移再与1进行&运算即可。
(注意:方法二代码中的">>>"运算符将0填充高位 仅可在Java中使用,c++无此运算符,感兴趣的同学可以在Java上测试)
代码:
int n, count = 0; cin >> n ; //获取输入的整数
for(int i = 0; i < n/2; i++)
{
if((( n >>> i)& 1) == 1 ) count++;
cout << “整数” << n << “二进制中1的个数为:” << count << endl;
}
方法三(博主推荐):
在二进制中,(x – 1) & x 即把x的最低位 1 消除,如此循环运算直到判断结果 == 0,并统计 循环的次数 即为整数二进制中 1 的个数;
如: 10100 -1 = 10011 & 10100 = 10000
代码:
#include <iostream>
using namespace std;
int main()
{
system("color F0");
int n, count = 0;
cout << "请输入需要判断的整数:" << endl;cin >> n ; //获取输入的整数
int m = n;
while( n != 0 )
{
n = (n - 1) & n;
count++;
}
cout << "整数" << m << "二进制中1的个数为:" << count << endl;
system("pause");
return 0;
}
测试运行结果如图: