C语言计算一个整数的二进制(补码)中有多少个1

方法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;
}

你可能感兴趣的:(c语言)