首页 > 其他 > 详细

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

时间:2015-09-27 20:13:19      阅读:302      评论:0      收藏:0      [点我收藏+]
/*
问题描述:
输入一个十进制的整数,转化为二进制,输出有多少个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;
}

 

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

原文:http://www.cnblogs.com/hgonlywj/p/4842552.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!