takumifukasawa’s blog

WebGL, Shader, Unity, UE4

【Javascript】ビット演算で2の累乗判定する関数

2の累乗判定をするときに、ビット演算だとかなりシンプルになることを知ったのでそのメモになります。

こちらがその関数です。

const isPowerOfTwo = x => (x & (x - 1)) === 0

原理は以下のようなものです。

数値が2の累乗の場合は必ず最上位ビットのみが1になります。 その数値に1を引くとすべてのビットが反転するので、元の数値-1をした数値論理積 & を使うと 0 になる性質を利用しています。

2 ... (10 & 01) === 0 => 00 === 0 => true
3 ... (11 & 10) === 0 => 10 === 0 => false
4 ... (100 & 011) === 0 => 000 === 0 => true
5 ... (101 & 100) === 0 => 100 === 0 => false
8 ... (1000 & 0111) === 0 => 0000 === 0 => true