【面试题】剑指Offer-10-统计二进制中1的个数

题目概述

实现一个函数,要求输入一个整数,输出该数对应的二进制数中1的个数

比如9表示成二进制是1001,那么输入9的话,屏幕上打印2

求解方法1

代码实现

size_t numberOf1(int value)
{
	int count = 0;
	while(value)
	{
		if(value&1)
			++count;
			
		value = value >> 1;
	}
	
	return count;
}

分析:

这种方法遇到的一个问题就是负数,如果传入一个-1,那会怎样?

对,无限循环

我们需要改进

求解方法2

代码实现

//防止出现负数导致无线循环
size_t numberOf1(int value)
{
	int count = 0;
	for(size_t i = 0; i<32; ++i)
	{
		if(value%1)
			++count;
		
		value = value >> 1;
	}
	return count;
}

分析:

负数也可以进行计算,但每次都要循环32次,能不能优化一下呢?

求解方法3

 

代码实现

//当一个数与上比自己小1的数,那么该数最后一个1会被置为0
size_t numberOf1(int value)
{
	int count = 0;
	while(value)
	{
		++count;
		value = (value - 1)&value;
	}	
	
	return count;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值