算一个整数在其二进制表示中“1”的个数
方法一
同理十进制的除法 除2法
int count_munmber1(int a)
{
int count = 0;
if (a)
{
if (a % 2)
{
return 1+ count_munmber1(a / 2);
}
else return 0 + count_munmber1(a / 2);
}
else return 0;
}
方法二
按位操作与循环遍历
int count_munmber1(int a)
{
if (a)
{
if (a&1)
{
return 1+ count_munmber1(a >>1 );
}
else return 0 + count_munmber1(a >>1);
}
else return 0;
}
方法三
int tree(unsigned int a) {
int count = 0;
while (a) {
a = a & (a - 1);
count++;
}
return count;
该方法被称为 Brian Kernighan 算法,其巧妙之处在于每次循环都将a
与a-1
进行按位与操作。由于任何非零整数减1后,其最低位的1会变为0,而低位的所有0都会变为1,这样就消除了原整数二进制表示中的最右边的一个1。