1.统计二进制中 1 的个数(一题3解)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//统计十进制数中某个数字的个数时有 : %10  然后  /10  ;
//类比:统计二进制数字 1 的个数即 :%2   然后  /2  ;
int count_number_of_1(unsigned num)
{
	//用 unsigned num 来接收是为了让负数的补码变为正数;
	//比如:-1
	//       -1的补码: 1111 1111 1111 1111 1111 1111 1111 1111
	// 用unsigned num接受后,1111 1111 1111 1111 1111 1111 1111 1111就变成一个正数的补码,
	//则该正数的原码为1111 1111 1111 1111 1111 1111 1111 1111
	//从而统计出 -1 中 1 的个数;
	int count = 0;
	while (num)
	{
		if (num % 2 == 1)
		{
			count++;
		}
		num = num / 2;
	}
	return count;
}

//一位一位的慢慢对比
int count_number_of_2(num)
{
	int count = 0;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		if ((num & 1) == 1)
		{
			count++;
		}
		num >>= 1;
	}
	return count;
}

//十分巧妙
int count_number_of_3(num)
{
	int count = 0;
	while (num)
	{
		num = num&(num - 1);
		//经过这步计算之后,m 中最右边的 1 将被消除;
		//比如:
		    //  num=16    0001 0000
		    //num-1=15    0000 1111
		    //   &        0000 0000
		    //    count++;
		    //    循环结束,一共 1 个 1;
		count++;
	}
	return count;
}
int main()
{
	int num = 0;
	scanf("%d", &num);
	int ret = count_number_of_3(num);
	printf("%d\n", ret);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值