100 1的个数

来源:互联网 发布:尼特罗会长知乎 编辑:程序博客网 时间:2024/05/08 19:59

1的个数

时间限制:3000 ms  |  内存限制:65535 KB
难度:1
描述
小南刚学了二进制,他想知道一个数的二进制表示中有多少个1,你能帮他写一个程序来完成这个任务吗?
输入
第一行输入一个整数N,表示测试数据的组数(1<N<1000)
每组测试数据只有一行,是一个整数M(0=<M<=10000)
输出
每组测试输出占一行,输出M的二进制表示中1的个数
样例输入
3467
样例输出
12

3


#include <iostream>using namespace std;int main(){int N;cin >> N;while(N--){int M;int sum=0;cin >> M;while(M){/*<span style="white-space:pre"></span>M=M&(M-1)<span style="white-space:pre"></span>达式的意思就是:<span style="white-space:pre"></span>把x的二进制表示从低位开始,<span style="white-space:pre"></span>将遇到的第一个为1的比特位置0。*/M=M&(M-1);sum++;}cout << sum << endl;}return 0;}

这题的第一反应是先把数字转换成二进制,再判断每位数字是否为1,但又想到了位运算。M与M-1相差1,那么每次按位与操作,都会使二进制中的最后一个1置零(原来是0的位,向上一位借2后减1后变为1;原来是1的位,减1后变为0,两种情况按位与的结果都为零,达到预期效果


0 0
原创粉丝点击