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

题目概述

实现一个函数,要求输入一个整数,输出该数对应的二进制数中1的个数。例如9表示成二进制是1001,那么输入9的话,屏幕上打印2

求解方法1

size_t numberOf1(int value)
{
	int count = 0;
	
	while(value){
		if(value & 0x01){
			++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;
}

————————————————————————————————————————
版权声明:本文为CSDN博主「皓皓松」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_31828515/article/details/62041384
————————————————————————————————————————

发布了10 篇原创文章 · 获赞 0 · 访问量 524

猜你喜欢

转载自blog.csdn.net/TurboTab/article/details/104755767
今日推荐