【LeetCodeゼロブラシから】Number of 1 Bits&Power of Two


タイトル:
Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight).  For example, the 32-bit integer ’11' has binary representation 00000000000000000000000000001011, so the function should return 3.
回答:
実は最初から問題を見ていたので、私は呆然としていました...11億円、11億円、11億円あとで11が十進法の「十一」であることをよく考えます...
数値のバイナリ化後の1の個数を統計することを意味します.最も直接的な方法はmod 2を続けて1かどうかを判断することです.これでタイムアウトになるそうですが・・・バイナリは、ビット演算を導入できるかどうか考えてみましょう(一般的には、ビット演算は加減乗除などの計算よりずっと速く、使えるなら多く使います).
原数を右に移動し、1ビットと演算(&)して、最後のビットが1であるかどうかを判断し、count++にすることができます.原数が0になったことを知ってから停止します.
しかし、もし問題が負数に広がったら、どうしますか.右に移動し続けた後、シンボルビットが変わらず1になるのは無限ループではないでしょうか.このとき、ハミング重量は、XとX−1ビットと得られた最低ビットが永遠に0であるという事実に基づいて導入することができる.例:
Expression
Value
X
0 1 0 0 0 1 0 0 0 1 0 0 0 0
X-1
0 1 0 0 0 1 0 0 0 0 1 1 1 1
X & (X-1)
0 1 0 0 0 1 0 0 0 0 0 0 0 0
マイナス1操作は、右端の記号を0から1、1から0に変更します.このように操作した後の直接的な結果は,原数が1ビット少なくなったことである.また,負数についても同様にループ終点がある.
class Solution {
public:
    int hammingWeight(uint32_t n) {
        int count = 0;
        while(n)
        {
            count++;
            n = n&(n-1);
        }
        return count;
    }
};

私の説明がはっきりしていないと思って、見てもいいです:クリックしてリンクを開けます
もう一つの小さな問題を残します:どのように1つの数が2の整数次べき乗かどうかを判断しますか?(ヒント:2を見て、ビット演算を考えます!漢明の重量を利用します)
タイトル:
Given an integer, write a function to determine if it is a power of two.
回答:
この問題の原理は難しくない.2のべき乗(int)タイプは正の数になるため、ピットは負の数を除外する必要があります.
class Solution {
public:
    bool isPowerOfTwo(int n) {
        if(n <= 0)      return false;
        if(n & (n-1))   return false;
        else            return true;
    }
};