ビット論理積という考え方を使うらしい。&で記述できる。
fn is_power_of_two(n: i32) -> bool {
n > 0 && (n & (n-1)) == 0
}
n > 0 は単純にゼロ以下だったらfalseになるため(2の累乗が0以下になることはない)。
2の累乗である数は、2進数表記した場合に1桁の1があり、それ以外の桁が0である数のことです。
例えば、2^3 = 8は、2進数表記すると1000で、2^4 = 16は、2進数表記すると10000です。
この性質を利用すると、ある数が2の累乗であるかどうかを判定できます。
ビット論理積について
ビット論理積は、2つのビット列を比較して、両方のビットが1である部分だけを残した結果を返す演算です。ビット論理積の記号は & です。
たとえば、2進数表現で 1101 と 1011 のビット論理積は以下のようになります。
1101
&
1011
------
1001
上記の例では、1101 と 1011 のビット論理積は 1001 になります。これは、2進数表現で9に相当します。
ビット論理積が0になる場合、つまり2つのビット列の論理積の各ビットが0になる場合には、以下のような特徴があります。
1.どちらかのビットが0の場合、結果のビットは必ず0になる。
2.両方のビットが1の場合、結果のビットは1になる。
例えば、2進数の「1001」と「0110」のビット論理積は「0000」となります。これは、上記の特徴から以下のように計算できます。
1001
&
0110
-----
0000
つまり10進数では0になるため、trueが返ります。