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