// 这种解法需要循环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;
}