题目
输入一个整数,判断该正数的二进制表示中有多少个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 }