// This solution requires 32 cycles 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 ; the while (uiFlag) { IF (iNum & uiFlag) { iCount ++ ; } uiFlag = uiFlag << . 1 ; } return iCount; #endif } // This solution will experience negative cycle of death! ! ! ! int BinaryOneNum_1 ( int iNum) { int iCount = 0 ; the while (iNum) { IF (iNum & 0x01 ) { iCount ++ ; } iNum = iNum >> . 1 ; } return iCount; } // optimal solution // 1100--> a Save -> 1001 // 1100 is & 1001 -> 1000 int BinaryOneNum_2 ( int iNum) { int iCount = 0 ; the while (iNum) { iCount ++ ; iNum = (iNum - 1 ) & iNum; // every time calculation, rightmost 1 is cleared 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 ++ ) { the printf ( " Method a: (% d) the number of 1s in binary:% D \ n- " , aiArray [I], BinaryOneNum (aiArray [I])); } COUT << " ============================================== " << endl ; for ( int I = 0 ; I <iLen; I ++ ) { IF (aiArray [I] < 0 ) { Continue ; } the printf ( " method two: (% d) binary number of 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; }
The number of binary 1: Title ten
Guess you like
Origin www.cnblogs.com/yzdai/p/11258672.html
Ranking