函数返回一个int参数打开的位的数量解决方案

函数返回一个int参数打开的位的数量
#include<stdio.h>
#define SIZE sizeof(int)*8
int setting(int a);
int main(void)
{
printf("%d",setting(12));
return 0;
}
int setting(int a)
{
int count=0;
while(a/2)
{
count+=a%2;
a=a>>1;
}
count+=a%2;
return count;
}


实在不明白while里面循环的是什么。。。。
能给下提示么。。各位前辈函数返回一个int参数打开的位的数量解决方案
------解决思路----------------------
计算a的二进制表示中的1的个数
while的条件实际上是a大于1
循环体中将a最低位加到count中,然后a除以2
循环后再将a小于或等于1中等于1时的一位加进来
------解决思路----------------------
while(a/2)                        //a被2整除  整数部分不为零则执行。
    {
        count+=a%2;          //count = count + a被2整除的余数
        a=a>>1;                   //a右移一位    等价于a = a / 2
    }

------解决思路----------------------
显然是在统计int二进制位上1的个数~
下面的这个方法,效率更高:

int countOne(int a)
{
int count = 0;
while (a)
{
count++;
a = a&(a - 1);
}
return count;
}