1.int 一共有32位,我们要知道一个数取余2等于1(n%2==1),就可以得到二进制中1的个数.然后一个数除于2(n=n/2),就可以使32位向右一位(例如:5 为101,5/2==2,2为 10,)。
方法1(不可以输入负数)
//写一个函数返回参数二进制中1的个数
//方法1
int count(int n ,int z)
{
//当a为正数的
if (n > 0)
{
for (int i = 0; i <= 32; i++)
{
if ((n % 2) == 1)
{
z++;
}
n = n / 2;
}
}
return z;
}
int main()
{
int a = 0;
int z = 0;
scanf_s("%d", &a);
int c=count(a ,z);
printf("%d", c);
return 0;
}
方法二(可以用求一,用位操作符和算术操作符(n >>i)&1) == 1)
方法2
int count(int n, int z)
{
for (int i = 0; i < 32; i++)
{
if (((n >>i)&1) == 1)
{
z++;
}
}
return z;
}
int main()
{
int a = 0;
int z = 0;
scanf_s("%d", &a);
int c=count(a ,z);
printf("%d", c);
return 0;
}
方法三(可以输入负数,用无符号数 unsigned int n=0)方法三(n=n&(n-1))可以消失一个1
//如 n=15
//1111 n
//1110 n-1
//1110 n=n&(n-1)
//1110 n
//1101 n-1
//1100 n=n&(n-1)
//方法三(n=n&(n-1))可以消失一个1
//如 n=15
//1111 n
//1110 n-1
//1110 n=n&(n-1)
//1110 n
//1101 n-1
//1100 n=n&(n-1)
int count(int n, int z)
{
while (n)
{
if (n > 0)
{
//return a & count(a - 1,z+1);
n = n & (n - 1);
z++;
}
}
return z;
}
int main()
{
int a = 0;
int z = 0;
scanf_s("%d", &a);
int c=count(a ,z);
printf("%d", c);
return 0;
}
标签:count,return,函数,1110,二进制,32,个数,++,int
From: https://blog.csdn.net/scy2429828663/article/details/140591562