如果有负数,当成无符号位处理,如-1,原来是//1000000000000000000001,反码1111111111111111111111111110,补码为1111111111111111111111111111
#include <stdio.h>
int func(unsigned int n)//如果有负数,当成无符号位处理
{
int count=0;
while(n)
{
if(n%2==1)
{
count++;
}
n=n/2;
}
return count;
}
int main()
{
int n=0;
int ret;
scanf("%d",&n);
ret=func(n);
printf("count=%d\n",ret);
return 0;
}
另一种:
#include <stdio.h>
int func(int n)
{
int count=0;
int i=0;
for(i=0;i<31;i++)
{
if(((n>>i)&1)==1)//每个二进制位与1按位与,有0就为0;
{
count++;
}
} return count;
}
int main()
{
int n=0;
int ret;
scanf("%d",&n);
ret=func(n);
printf("count=%d\n",ret);
return 0;
}
另一种方法:
//n=n&(n-1)
//n=13
//1101 n
//1100 n-1
//1100 n
//1011 n-1
//1000 n
//0111 n-1
//0000
#include <stdio.h>
int func(int n)
{
int count=0;
while(n)
{ //同理,n=n | (n+1)可以让n最右边的1变为0;
n=n&(n-1); //每一次相与,都能让对方二进制位中最右边的1消失,当n二进制位为0时,余的次数就代表有几个1;
count++; //n变为0之前n&(n-1)赋给n这个动作能执行几次,就代表二进制位中有多少个1
}
return count;
}
int main()
{
int n=0;
int ret;
scanf("%d",&n);
ret=func(n);
printf("count=%d\n",ret);
return 0;
}