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

    技术2022-07-11  89

    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 <iostream> using namespace std; /*! * \brief 计算一个数字的二进制中0或1的个数 * \param nData : int 待计算数字 * \param bZeroOrOne : bool 计算0或1的个数(true:计算0的个数;false:计算1的个数) * \returns int : 0或1的个数 * \throws <exception class> * \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; }

    Processed: 0.012, SQL: 9