10--输入一个十进制的整数,转化为二进制,输出有多少个1

/*
问题描述:
输入一个十进制的整数,转化为二进制,输出有多少个1.

解题思路:
    (1):位操作,然后移动光标。不是移动输入数字,而是移动flag。
        因为负数第一个为1,向右移动为了保证负数,所以填充为1,
        出现无限循环的可能。
    
    (2):第二种效率更高,二进制出现多少个1,就循环多少次。
            while (n)
            {
                number++;
                n = (n - 1) & n;
            }

相关问题:
(1)
一条语句判断是不是2的整数次方。
            那就是判断是否只有一个1!
    if (n != 0 && (0 == (n - 1) & n))    printf("是2的整数次。\n")


(2)
把一个整数减去1之后,再和原来的整数相与,得到新的数,相当于把原来的数字,最右面的1换成0。
    printf("%d", x&(x-1));

*/

#include <stdio.h>

int countOneInNum1(int x)
{
    int number = 0;
    int i = 0;
    unsigned int flag = 1;        //无符号整型
    while (flag)
    {
        i++;
        if (x & flag)
            number++;
        flag = flag << 1;        //左移动flag
    }

    //循环了32次 int占4个字节, 4 * 8 = 32
    printf("循环了-- %d -- 次\n", i);
    return number;
}

int countOneInNum2(int n)
{
    int number = 0;
    while (n)
    {
        number++;
        n = (n - 1) & n;
    }

    return number;
}


int main()
{
    int x;
    scanf("%d", &x);

    printf("%d\n", countOneInNum1(x));
    printf("%d\n", countOneInNum2(x));

    //把一个整数减去1之后,再和原来的整数相与,得到新的数,
    //相当于把原来的数字,最右面的1换成0。
    printf("%d\n", x&(x-1));

    if (x != 0 && (0 == ((x - 1) & x)))    
        printf("%d是2的整数次。\n", x);

    return 0;
}

 

posted on 2015-09-27 19:01  HGonlyWJ  阅读(1880)  评论(0编辑  收藏  举报

W3C中国
阮老师的网络日志
canvas
runoob
迷渡
并发编程网
原生JS例子
前端外刊评论