【毎日1題】ビット操作のコツ
このテクニックは191を解決するために使用することができる.ビット1の個数と231.2の値を増やします.
主な動作は
では、1つの整数サイクルに対してこの操作を使用してカウントすると、整数の中に何ビット1があるかを統計することができます.つまり191題の構想で、コードは簡潔です.
231題も同様にこの特性を利用している.1つの整数が2のべき乗であれば、対応するバイナリ数は必ず1ビットだけが1であるため、一度操作して結果が1であるか否かを判断するだけでよい.本題では,n−1境界を越えないように,中間値タイプをlongに設定することに注意する.191は符号なし整数であることを示しているので、このような状況を考慮する必要はない.
主な動作は
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;
}
}