算法题5 二进制中1的个数

题目

  输入一个整数,判断该正数的二进制表示中有多少个1?如整数7,二进制为0111,共3个1.

分析

  整数n,如果n大于0,则其二进制形式至少有一位是1,如果将一个二进制数减1,那么这个二进制数的最右边的1将变成0,而这个1后面的0将全部变成1。例如二进制数1100,减1后是1011。这两个数相与的话,最右边的1及其后面的数均会变成0,这样就消掉了n最右边的1个1。因此对整数n循环减1相与,直至n=0,循环的次数就是二进制中1的个数。

代码

int TrueBitCounts(unsigned int n)
{
	int count=0;
	while (n>0)
	{
		n=n&(n-1);
		count++;
	}

	return count;
}

延伸:如果n可能是负数呢?

int TrueBitCounts(int n)
{
	int count=0;
	int num=(n>0)?n:-n;
	while (num>0)
	{
		num=num&(num-1);
		count++;
	}

	return (n>0)?count:count+1;
}

 

延伸:对于一个1*2*3*···n的连续乘积,结果的末尾有多少个0呢?

  对于一串数字的乘积结果来说,结尾0的个数和这串数字中的2因子和5因子的个数有关系。当2的因子个数多余5时,和5因子的个数有关,反之和2因子的个数有关,如2*3*5*15这样一串数有1个2因子,有两个5因子,因此结果末尾有1个0

  对于连续的一串数字来说,2因子的个数明显多余5因子,所以只要计算这串数字中含有因子5的个数即可

 1  int NumOfZero(unsigned int n)
 2  {
 3      int count=0;
 4      int pow=5;
 5      while(n/pow>0)
 6      {
 7          count+=n/pow;
 8 
 9          pow*=5;
10      }
11      return count; 
12  }

 

原文地址:https://www.cnblogs.com/wangzaizhen/p/5167167.html