// この溶液を32サイクルが必要 int型 BinaryOneNum(INT INUM)を { #IF 0 INT = ICOUNT 0 ; のため(int型 I = 0 ;私は< 32 ; Iは++ ) { IF(&INUM(0x01の << I)) { ICOUNT ++ ; } } 戻りICOUNTと、 の#else INT = ICOUNT 0 ; 符号なし整数 uiFlag = 1。; しばらく(uiFlag) { IF(INUM&uiFlag) { ICOUNT ++ ; } uiFlag = uiFlag << 1。; } 返すICOUNTを; #endifの } // このソリューションは、死の負のサイクルを経験するでしょう!!!! INT BinaryOneNum_1(INT INUM) { int型 ICOUNT = 0 ; 一方(INUM) { IF(INUM&0×01 ) { ICOUNT ++ ; } INUM = INUM >> 1 ; } 戻りICOUNTを; } // 最適解 // 1100 - >保存- > 1001 // 1100がある&1001 - 、> 1000 INT BinaryOneNum_2(INT INUM) { int型 ICOUNT = 0 。 一方、(INUM) { ICOUNT ++ ; INUM =(INUM - 1)&INUM; // 毎回計算、右端の1が0にクリアされている } 戻りICOUNTを; } ボイドBinaryOneNumTestFunc() { 裁判所未満 << " \ N \ N --------------- BinaryOneNumTestFuncスタート--------------> " << てendl; INT aiArray [] = { 0、9、100、1000年、10000、100000、999999、4353544、675753、 - 32445 - 、3445、34424、 - 111 }。 INT ILEN = はsizeof(aiArray)/ はsizeof(INT )。 以下のための(int型私は= 0 ; IはILENを<; Iは++ ) { のprintf(" 方法:(%d)は、バイナリで1の数:%D \ N- " 、aiArray [I]、BinaryOneNum(aiArray [I])); } COUT << " ============================================== " << ENDL; のための(int型 I = 0 ; IはILENを<Iは++ ) { IF(aiArray [I] < 0 ) { 続行; } のprintf(" 方法2:1の(%d)が進数:%D \ nは" 、aiArray [I]、BinaryOneNum_1(aiArray [I]))。 } 裁判所未満 << " ============================================== 「 << てendl; 以下のために(int型 i = 0 ; iはILENを<; iは++ ) { のprintf(" 方法三(%d)は二进制中1的个数:%Dを\ n " 、aiArray [i]は、BinaryOneNum_2(aiArray [I])) ; } coutの << " \ N \ N --------------- BinaryOneNumTestFunc終了--------------> " << てendl; }
2進数の1の数:タイトル10
おすすめ
転載: www.cnblogs.com/yzdai/p/11258672.html
ランキング