1的个数
时间限制:3000 ms | 内存限制:65535 KB
难度:1
输入
第一行输入一个整数N,表示测试数据的组数(1<N<1000)
每组测试数据只有一行,是一个整数M(0=<M<=10000)
输出
每组测试输出占一行,输出M的二进制表示中1的个数
样例输入
3 4 6 7
样例输出
1 2 3
描述
小南刚学了二进制,他想知道一个数的二进制表示中有多少个1,你能帮他写一个程序来完成这个任务吗?
我的代码:
#include <stdio.h>
int main (void)
{
int n,m,i,cnt;
scanf("%d",&m);
while(m--)
{
cnt=0;
scanf("%d",&n);
while(n)
{
if(n%2) cnt++;
n=n/2;
}
printf("%d\n",cnt);
}
}
优秀代码:
#include<stdio.h>
main(){
int n,m,s;
scanf("%d",&n);
while(n--){
scanf("%d",&m);
s=0;
while(m){
m&=m-1; //按位与操作符
s++;
}
printf("%d\n",s);
}
}
&除取地址符外,还有另外一个身份,按位与操作符
即:相应的bit位值同为1时结果为1,否则结果为0
此段代码里,m与m-1相与,每与一次,计数s增加1,直至相与结果为0,结束循环,此时s的数值即为此数中1的个数。
一个求二进制中,1的个数的新方法!