2進数の1の数:タイトル10

// この溶液を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 [] = { 091001000年100001000009999994353544675753、 - 32445 - 、344534424、 - 111 }。
    INT ILEN = はsizeof(aiArray)/ はsizeofINT )。

    以下のための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; 

}

おすすめ

転載: www.cnblogs.com/yzdai/p/11258672.html