初级-有多少个1

题目描述: 请实现一个函数,输入一个整数,输出该整数使用二进制表示时1的个数,例如把9表示成二进制是1001,有2位是1,因此得出结果为2。
  输入:首先输入样例个数,然后输入需要判断的整数。
  输出:输出该整数中1的个数。

 

 样例输入:
  2
  9
  99
样例输出:
  2
  4

 

 下面给出3种题解,这里主要分析规律:把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0,那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。

 1 #include<stdio.h>
 2 
 3 //1、普通级别,即每次把n右移一位,与1相与,判断结果。
 4 //分析:当n<0时,这种情况有可能出现死循环。
 5 int Numberof1_0(int n){
 6 
 7     int count = 0;
 8 
 9     while(n){
10         if(n&1)
11             count++;
12         n>>1;
13     }
14     return count;
15 }
16 
17 //2、普通级别优化,声明一个变量,每次左移变量与n相与,判断结果。
18 int Numberof1_1(int n){
19 
20     int count = 0;
21     int flag = 1;
22 
23     while(flag){
24         if(n&flag)
25             count++;
26         flag<<1;
27     }
28     return count;
29 }
30 
31 //3、找规律,写代码。
32 int Numberof1_2(int n){
33 
34     int count = 0;
35 
36     while(n){
37         count++;
38         n = (n-1)&n;
39     }
40     return count;
41 }
42 
43 int main(){
44     int n,k;
45 
46     scanf("%d",&k);
47 
48     while(k--){
49         scanf("%d",&n);
50 
51         printf("%d\n",Numberof1_2(n));
52     }
53 
54     return 0;
55 }

 

接下来,我们再思考一个问题:判断一个正整数是否为2的乘方,比如8 = 2x2x2,那么8就是2的乘方。

  分析:一个正整数要为2的乘方,那么其二进制一定只有最高位为1,如果我们把他做减1操作,然后再做&操作,如果为2的乘方,那么结果一定为0,即(n&(n-1)) = 0

    例如正整数8,转化为二进制为100,那么进行判断就是(100 & (011)) = 0,所以8为2的乘方。

posted @ 2017-07-11 09:19  某某璀  阅读(230)  评论(0)    收藏  举报
levels of contents