写一个函数返回参数二进制中 1 的个数

方法一:

注意
(1)这种方法是采取按位于,即让索要判断的数和1 与,可以判断最后一位是0还是1,然后每判断一次
向右移动一位再判断下一位,以此类推循环32次,即可知道这个数的每一位情况

#include <stdio.h>
int main ()
{
	int num=0,i=0,count=0;
	scanf("%d",&num);
	for(i=0;i<32;i++)  //只是控制循环32次(每个整型数按32位来计算)
	{
		if((num&1)==1)
		{
			printf("1 ");  //如果某一位与1的结果为1,则这个位上是1
		    count++;   //计数器计算1的个数
		}  
		    num=num>>1;  //没判断完一位,这个数向右移动1位,再判断下一位
	}
	printf("\n");
	printf("count=%d",count);
	return 0;
方法二:

注意

(1)这种方法本质上和下一种是一样的,只是这种表面看起来是二进制数向右移动0,1,2...31位,这
个只是相对于这个数原来的样子,其实每次也是一位一位判断的,这个和另一种一定要加以区分

#include <stdio.h>
int main ()
{
	int num=0,i=0,count=0;
	scanf("%d",&num);
	for(i=0;i<32;i++)
	{
		if((num>>i)&1==1)  //每次移动i位再和1进行与,i从0到31,也是判断每一位1还是0
		{
			count++;
			printf("1 ");
		}
	}
	printf("\n");
	printf("count=%d",count);
	return 0;
}

方法三:(最优化)

        这种方法非常简便,根据一个整数每次和比自己小一的数按位与,结果会使得原来的这个整数的二进制位少一个1这个特点,可以设置一个循环,直到这个数到0为止,每

循环一次,count自增1,说明记录一个1

#include <stdio.h>
int main ()
{
	int num=0,i=0,count=0;
	scanf("%d",&num);
	while(num)
	{
		num=(num)&(num-1);
		count++;
	}
	printf("count=%d",count);
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值