C++版本计算一个数字的二进制中0或1的个数原理讲解及代码实现

C++版本计算一个数字的二进制中0或1的个数原理讲解及代码实现

/*!
* Copyright (c) 2020,ZYF.
* All Rights Reserved.
*
* \file main.cpp
* \brief 测试
*
* \author ZYF
* \date 2020/7/1 22:06:34
* \version 1.0.0
*/

#include 
using namespace std;

/*!
* \brief 计算一个数字的二进制中0或1的个数
* \param nData : int 待计算数字
* \param bZeroOrOne : bool 计算0或1的个数(true:计算0的个数;false:计算1的个数)
* \returns int : 0或1的个数
* \throws 
* \remarks 
* \see 
*/
int GetSum(int nData, bool bZeroOrOne = false)
{
	/*
	X&(X-1) ;统计X的二进制中1的个数;
	X|(X+1);统计X的二进制中0的个数;

	& (位“与”):都为1时,结果为1
	| (位“或”):只要有一个为1,结果就是1
	*/

	int nSum = 0;

	if (!bZeroOrOne)
	{
		/*
		算法逻辑:
			把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。
			那么一个整数的二进制有多少个1,就可以进行多少次这样的操作
		*/

		while (nData)
		{
			nSum++;
			nData &= (nData - 1);
		}
	}
	else
	{
		/*
		算法逻辑:
			
		*/

		while (nData + 1)
		{
			nSum++;
			nData |= (nData + 1);
		}
	}

	return nSum;
}

int main(int argc, char* argv[])
{
	int nData = 300;
	int nSum_Zero = GetSum(300, true);
	int nSum_One = GetSum(300, false);
	printf("\n数字%d的二进制数中,0的个数为%d个,1的个数为%d个\n",nData,nSum_Zero,nSum_One);
	
	return 1;
}

C++版本计算一个数字的二进制中0或1的个数原理讲解及代码实现_第1张图片

你可能感兴趣的:(C/C++,c++,算法,数据结构)