単一のビット演算で数が2のべき乗であるかどうかを判定する
正の整数 n
が与えられたとき、それが2のべき乗であるかどうかを調べます。実は、単一のビット演算を使って簡単に判定できます。2のべき乗となる数のビット表現を考えると、ビット列の中に 1
がひとつだけ存在し、それ以外のビットはすべて 0
になっています。
2^n の数 | 2進数表現 |
---|---|
8 | 1000 |
32 | 100000 |
128 | 10000000 |
ランダムな数 | 2進数表現 |
---|---|
7 | 111 |
67 | 1000011 |
144 | 10010000 |
これは2進数表現の定義からもわかります。ビット列のある位置に1が立っていれば、その位置が表す2のべき乗分が足し合わさります(たとえば 67 = 1 + 2 + 0 + 0 + 0 + 0 + 64、8 = 0 + 0 + 0 + 8)。つまり、ビット列に 1
が一つだけということは、その位置の2のべき乗分だけが含まれていることを意味します。したがって、問題は n
のビット列に 1
がちょうど一つだけあるかを確認することになります。
この判定を簡単に行う方法として、n & (n-1)
のビットANDを取り、それが0かどうかを確認するやり方があります。計算結果が0であれば、それは2のべき乗です。
2のべき乗ではない数に対しては、n & (n-1)
の結果が0にはなりません:
7 & 6 = 111 & 110 = 110 (6)
67 & 66 = 1000011 & 1000010 = 1000010 (66)
144 & 143 = 10010000 & 10001111 = 10000000 (128)
しかし、2のべき乗の数では常に結果が0になります:
8 & 7 = 1000 & 111 = 0
32 & 31 = 100000 & 11111 = 0
128 & 127 = 10000000 & 1111111 = 0
入力
入力の最初の行には、整数 n
(2 ≤ n ≤ 10^9) が1つ与えられます。
出力
もし n
が2のべき乗であれば Yes
、そうでなければ No
と出力してください。
例
Input | Output |
---|---|
8 | Yes |
17 | No |
2048 | Yes |
Constraints
Time limit: 2 seconds
Memory limit: 512 MB
Output limit: 1 MB