【毎日1題】ビット操作のコツ


このテクニックは191を解決するために使用することができる.ビット1の個数と231.2の値を増やします.
主な動作はn &= n-1であり、この動作はバイナリ数の最後の1を除去することができる.
では、1つの整数サイクルに対してこの操作を使用してカウントすると、整数の中に何ビット1があるかを統計することができます.つまり191題の構想で、コードは簡潔です.
public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int count = 0;
        while (n != 0) {
            n &= (n - 1);
            count++;
        }
        return count;
    }
}

231題も同様にこの特性を利用している.1つの整数が2のべき乗であれば、対応するバイナリ数は必ず1ビットだけが1であるため、一度操作して結果が1であるか否かを判断するだけでよい.本題では,n−1境界を越えないように,中間値タイプをlongに設定することに注意する.191は符号なし整数であることを示しているので、このような状況を考慮する必要はない.
class Solution {
    public boolean isPowerOfTwo(int n) {
        if (n == 0) return false;
        long x = (long) n;
        return (x & (x - 1)) == 0;
    }
}