// 这种解法需要循环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; }
题目十:二进制中1的个数
猜你喜欢
转载自www.cnblogs.com/yzdai/p/11258672.html
今日推荐
周排行