题目1513:二进制中1的个数

题目描述:

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

 

输入:

输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。
。n保证是int范围内的一个整数。

 

输出:

对应每个测试案例,
输出一个整数,代表输入的那个数中1的个数。

 

样例输入:
3
4
5
-1
样例输出:
1
2
32
分析:(常规算法)把1和n做与运算,检验n最右一位是不是1,然后把1左移一位检验n右边第二位是不是1,依次进行,就可以得出n的2进制中有多少个1.
   (惊喜算法)把n-1与n做与运算,会把n最右边一个1变成0,那么n的二进制表示中有多少个1,就可以进行多少次这样的操作.
#include <stdio.h>

unsigned int flag=1;

void NumOfOneNormal(int n)
{
    flag=1;
    int cnt=0;
    while(flag)
    {
        if(n&flag)
            cnt++;
        flag=flag<<1;
    }
    printf("%d\n",cnt);
}

void NumOfOne(int n)
{
    int cnt=0;
    while(n)
    {
        cnt++;
        n=(n-1)&n;
    }
    printf("%d\n",cnt);
}

int main()
{
    int n,t;
    while(~scanf("%d",&t))
        while(t--)
        {
            scanf("%d",&n);
            NumOfOne(n);
        }
    return 0;
}

 


posted @ 2013-07-29 11:19  丶Blank  阅读(225)  评论(0编辑  收藏  举报