1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rustで2の累乗を判定する

Last updated at Posted at 2023-02-19

ビット論理積という考え方を使うらしい。&で記述できる。

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が返ります。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?