二进制中存放的是补码
#include <stdio.h>
count_bit_one(unsigned int a)
//思考为什么需要unsigned,因为如果没有的话,这个代码对于负数是无法求解的,所以针对负数做无符号位的定义
{
int count=0;
while(a)
{
if(a%2 == 1)
{
count++;
}
a=a/2;
}
return count;
}
int main()
{
int a=5;//二进制为101
int count=count_bit_one(a);
printf("%d\n",count);
return 0;
}
关注unsigned的使用
第二种方法,用按位与
int main()
{
unsigned int a=-1;//32个1
int count=0;
int b=1;
while(a)
{
if(a&b==1)
{
count++;
}
a=a/2;
}
printf("%d\n",count);
return 0;
}
第三种方法(思路很厉害)
#include <stdio.h>
int main()
{
int a=13;
int count=0;
//a:13--1101
//a-1:1100(一次)
//上面俩按位与:1100
//-1:1011(两次)
//&:1000
//-1:0111(三次)
//&:0000
while(a)
{
a=a&(a-1);
count++;
}
printf("%d\n",count);
return 0;
}