バイナリの1の個数


テーマ:関数を実装して、整数を入力して、その数のバイナリ表現の中の1の数を出力してください.例えば入力9は、そのバイナリ表現が1001である、2ビットが1であるため、9が入力と、この関数は2を出力.
通常の解法:1ビットを右に移動するたびに0001と演算し、合計1を統計します.
int NumberOf1(int n)
{
    int count =0;
    while(n)
    {
        if(n&1)
            count++;
        n=n>>1;
    }
    return count;
}

除算を用いずに右シフトを用いるのは,シフトよりも出発効率がはるかに低いためである.しかし、負の数を入力すると、右シフト中にその最上位ビットが1になり、最後の数字が0 xFFFFFFFFFFになり、デッドサイクルに陥るという問題があります.
改善:入力された数値を右に移動せず、左にシフトした数値
int NumberOf1(int n)
{
    int count =0;
    unsigned int flag=1;
    while(flag)
    {
        if(n&flag)
            count++;
        flag=flag<<1;
    }
    return count;
}

上記の解法サイクル数は整数バイナリのビット数に等しい.次の方法では、整数のうち1がどれだけあるかを何回か繰り返すだけです.1つの整数から1を減算し、元の整数と演算すると、証明書の一番右の1つが0になり、1つの整数のバイナリ表現のうち1つがどれだけあるかを何回操作するだけです.次のようになります.
int NumberOf1(int n)
{
    int count =0;
    while(n)
    {
        ++count;
        n=(n-1)&n;
    }
    return count;
}