剣指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
考え方は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);
}
};