一、题目描述
请实现一个函数,输入一个整数,输出该二进制表示中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;
}
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~