方法1:
递归方法,当一个数字除2余1时,表明其二进制中最低位为1
缺点:无法判断负数的补码中有多少个1
int calc(unsigned int n)
{
int count = 0;
while (n)
{
if (n % 2 == 1)
count++;
n = n / 2;
}
return count;
}
int main()
{
int n=0;
scanf("%d", &n);
int count = calc(n);
printf("%d", count);
return 0;
}
方法2:
1的补码为00000000 00000000 00000000 00000001
当给出的数字与1 进行&运算时,若其最低位为1,则得到的结果即为1
int类型的数据一共有32位,故定义一个变量 i 从1循环到31
再通过右移操作符,每次移动 i 位,从而将不同位置的1移动到最后一位,达到判断此时最后一位是不是1的效果
int calc(int n)
{
int i = 0, count = 0;
for (i = 0; i < 32; i++)
{
if (((n >> i) & 1 == 1))
count++;
}
return count;
}
int main()
{
int n;
scanf("%d", &n);
int count=calc(n);
printf("%d", count);
return 0;
}
方法三:
举例:当n取13时,其补码为 00000000 00000000 00000000 00001101
而n-1=12的补码为 00000000 00000000 00000000 00001100
若二者做&运算,则结果为 00000000 00000000 00000000 00001100
将其值赋给n,即此时的n=12
则n-1=11,其补码为 00000000 00000000 00000000 00001011
二者再进行&运算得到 00000000 00000000 00000000 00001000
重复上述操作 00000000 00000000 00000000 00000111
二者再进行&运算得到 00000000 00000000 00000000 00000000
即此时n=0,退出循环
可见该循环每次会去掉原来整数(13)中位于最后的1
计算得出的count,即为该整数二进制中1的个数
void count_bit(int n)
{
int count = 0;
while (n)
{
n = n & (n - 1);
count++;
}
printf("count=%d", count);
}
int main()
{
int n = 0;
scanf("%d",&n);
count_bit(n);
return 0;
}