10-二进制中1的个数

一、题目描述

        请实现一个函数,输入一个整数,输出该二进制表示中1的个数。例如把9变成二进制是1001,有2位是1。因此如果输入9,该函数输出2

二、解题思路

        如果选择对输入的二进制数本身做右移,通过与1做与运算记录该二进制中1的个数,则当该二进制数为负数时(原正数取反加1),由于符号位为1,右移高位补1,会导致死循环所以不选择对原二进制数本身做移动,那么就有如下两种解题思路
【方法一】常规解法
        从低到高位判断二进制数有多少个1,通过用1与该二进制数做与运算,判断最低位是否为1,然后1做左移,判断次低位是否为1,以此类推。所以循环的次数为该整数二进制的位数,比如32位的整数会循环32次
【方法二】聪明的解法:减少循环次数,有多少1循环多少次

        以1100为例,先将1100减1,变成1011,将1011和1100做与运算,得到1000,从结果可以看出,每次减1做与,会将二进制数最右边的1变成0,因此用一个变量count来记录原二进制数有多少次由1变成0,就知道该二进制数有多少个1了

三、解题算法

解法1:常规解法

/*************************************************************
Author:tmw
date:2018-6-30
**************************************************************/
#include <stdio.h>
#include <stdlib.h>

/**
* 方法一:常规解法
*/
int Number_of1_normal(int n)
{
    int count = 0;
    unsigned int flag = 1;

    while(flag) //循环int的位数次
    {
        if( n & flag )
            count++;
        flag = flag<<1; //flag左移:1->10->100->1000....
    }
    return count;
}

解法2:聪明的解法

/**
* 方法二:聪明的解法
*/
int Number_of1_better(int n)
{
    int count = 0;
    while(n)
    {
        count++;
        n = (n-1) & n
    }
    return count;
}


梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值