题目十:二进制中1的个数

// 这种解法需要循环32次
int BinaryOneNum(int iNum)
{
#if 0
    int iCount = 0;
    for (int i = 0; i < 32; i++)
    {
        if (iNum & (0x01 << i))
        {
            iCount++;
        }
    }

    return iCount;

#else 

    int iCount = 0;
    unsigned int uiFlag = 1;
    while (uiFlag)
    {
        if (iNum & uiFlag)
        {
            iCount++;
        }

        uiFlag = uiFlag << 1;
    }

    return iCount;
#endif
}

// 这种解法 遇到负数会死循环!!!!
int BinaryOneNum_1(int iNum)
{
    int iCount = 0;
    while (iNum)
    {
        if (iNum & 0x01)
        {
            iCount++;
        }

        iNum = iNum >> 1;  
    }

    return iCount;
}

// 最优解法
// 1100  --> 减一  --> 1001
// 1100 & 1001    --> 1000
int BinaryOneNum_2(int iNum)
{
    int iCount = 0;
    while (iNum)
    {
        iCount++;
        iNum = (iNum - 1) & iNum;   // 每计算一次,最右边的1会被清0
    }

    return iCount;
}

void BinaryOneNumTestFunc()
{
    cout << "\n\n --------------- BinaryOneNumTestFunc Start -------------->" << endl;

    int aiArray[] = {0, 9, 100, 1000, 10000, 100000, 999999, 4353544, 675753, -32445, -3445, 34424, -111};
    int iLen = sizeof(aiArray) / sizeof(int);

    for (int i = 0; i < iLen; i++)
    {
        printf("方法一: (%d)二进制中1的个数: %d\n", aiArray[i], BinaryOneNum(aiArray[i]));
    }

    cout << "==============================================" << endl;

    for (int i = 0; i < iLen; i++)
    {
        if (aiArray[i] < 0)
        {
            continue;
        }

        printf("方法二: (%d)二进制中1的个数: %d\n", aiArray[i], BinaryOneNum_1(aiArray[i]));
    }

    cout << "==============================================" << endl;
    for (int i = 0; i < iLen; i++)
    {
        printf("方法三: (%d)二进制中1的个数: %d\n", aiArray[i], BinaryOneNum_2(aiArray[i]));
    }

    cout << "\n\n --------------- BinaryOneNumTestFunc End -------------->" << endl;

}
posted @ 2019-07-28 13:30  VIP丶可乐  阅读(122)  评论(0编辑  收藏  举报