剣指offer-11バイナリ中1の個数


整数を入力し、その数のバイナリ表現の1つの数を出力します.ここで負数は補数で表される.
考え方は3つあります.
1.整数nと1を加算し、nを1ビット右にシフトしてループを解くが、nビットの負の数、右にシフトすると前に1を補うので、ループが死なないように注意する必要がある
2.タグビット1とnを設定し、タグビットを左に1ビット移動し、ループ解
3.n&(n-1)を利用して、例えばnのバイナリビット1100、n-1ビット1011との結果を1000とし、すなわちnの右端の1を0に変更する
4.bitsetを使う
コードは以下の通り、推奨方法3
class Solution {
public:
    //   :  n 1  ,  n  1 ,    
    int get_binary_1_number_method1(int n){
        int count = 0;
        if(n < 0){
            n = n & 0x7FFFFFFF;
            count++;
        }
        while(n){
            if(n & 1){
                count++;
            }
            n = n >> 1;
        }
        return count;
    }
    //   :     1,       n  ,     1      1 count++
    int get_binary_1_number_method2(int n){
        int count = 0;
        int flag  = 1;
        while(flag){
            if(n & flag){
                count++;
            }
            flag = flag << 1;
        }
        return count;
    }
    //   :  n 1100  n-1 1011 
    //n & (n-1) = 1000      n    1      0,       
    int get_binary_1_number_method3(int n){
        int count = 0;
        while(n){
            count++;
            n = n & (n-1);
        }
        return count;
    }
    //   :  bitset
    int get_binary_1_number_method4(int n){
        bitset<32> num(n);
        return num.count();
    }
    
    int  NumberOf1(int n) {
        //return get_binary_1_number_method1(n);
        //return get_binary_1_number_method2(n);
        return get_binary_1_number_method3(n);
        //return get_binary_1_number_method4(n);
    }
};