How many '1's are there

第一行输入数字n(n<=50),表示有n组测试用例,第2到第n+1行每行输入数m(m为整数),统计并输出m用二进制表示时,1的个数。

例如:m=9时,二进制表示为1001,则输出2.

Input:

2

3

7

Output:

2

3

 

利用位运算

 

 

我的是直接用二进制的计算算出来的

 1 #include<stdio.h>
 2 int main() {
 3     int n, m, i, sum = 0, yu;
 4     scanf("%d", &n);
 5     for (i = 0; i < n; i++) {
 6         sum = 0;
 7         scanf("%d", &m);
 8         while (m) {
 9             yu = m % 2;
10             if (yu == 1) {   
11                 sum++;
12             }
13             m = m / 2;
14         }
15         printf("%d\n", sum);
16     }
17     return 0;
18 }

 

  

而答案用了位运算&

#include<stdio.h>
2. 
3.int bitcount(int x) {
4.        int count = 0;
5.        while (x != 0) {
6.                x &= (x-1);
7.                count++;
8.        }
9.        return count;
10.}
11. 
12.int main() {
13.        int num;
14.        int x;
15.        scanf("%d", &num);
16. 
17.        while (num--) {
18.                scanf("%d", &x);
19.                printf("%d\n", bitcount(x));
20.        }
21.        return 0;
22.}

  

推荐阅读http://www.52rd.com/Blog/Archive_Thread.asp?SID=16977     

或者百度知道http://zhidao.baidu.com/question/89293878.html?qbl=relate_question_0&word=c%D3%EF%D1%D4%CE%BB%D4%CB%CB%E3

& 按位与   //2个都是1才为1   //按位与运算通常用来对某些位 清0 (这道题就是清0)或保留某些位。
| 按位或   //1个为1就是1
^ 按位异或 // 相异时为1
~ 取反
<< 左移
>> 右移   //<<是左移,比如1<<n,表示1往左移n位,即数值大小乘以2的n次方
        >>右移,类似左移,数值大小除以2的n次方

            unsigned char x;
          x=127;//(二进制:0111 1111)
              //x<<1后的结果:1111 1110 <=> 254
          printf(''%o",x<<1); //按8进制输出376

 

                              优先级

1
~
2
<<、>>
3
&
4
^
5
|
6
&=、^=、|=、<<=、>>=

 

 

还有一个函数可以直接得到二进制数有多少个1

#include<stdio.h>
int main() {
    int n, s;
    scanf("%d", &n);
    printf("%d", __builtin_popcount(n));
}

 

posted on 2015-12-18 15:11  _阿赞  阅读(276)  评论(0编辑  收藏  举报