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;
}

 

转载于:https://www.cnblogs.com/hgonlywj/p/4842552.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值