1的个数

来源:互联网 发布:3d照相机软件 编辑:程序博客网 时间:2024/06/07 11:26

1的个数


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


***************************************************************************************************************

我的代码:

#include "stdio.h"int main(){int N,M ;scanf("%d",&N);while(N--){scanf("%d",&M);int k=0;while(M!=0){if(M & 1){k++;}M=M>>1;}printf("%d\n",k);}return 0;}


分析:

这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。

一个很基本的想法是,我们先判断整数的最右边一位是不是1。接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次移动一位,直到这个整数变成0为止。现在的问题变成怎样判断一个整数的最右边一位是不是1了。

很简单,如果它和整数1作位与运算(&)。由于1除了最右边一位以外,其他所有位都为0。因此如果位与运算的结果为1,表示整数的最右边一位是1,否则是0。


所以,如果写成函数的话,就是这种形式:

int NumberOf1_Solution1(int i)
{
      int count = 0;
      while(i)
      {
            if(i & 1)
                  count ++;

            i = i >> 1;
      }

      return count;
}


要注意,按位与(&)、按位或(|)、异或(^)

不要把它们弄混了~~~

0 0