JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで数値が2の累乗かどうかを判定する方法

2の累乗判定関数とは

正の整数を受け取り、その数が2の累乗であるかどうかに応じて真偽値(boolean)を返す関数、例えば isPowerOfTwo() を作成する必要があります。

具体的には、次のような動作を想定します。

console.log(isPowerOfTwo(3)); //false
console.log(isPowerOfTwo(32)); //true
console.log(isPowerOfTwo(2048)); //true
console.log(isPowerOfTwo(256)); //true
console.log(isPowerOfTwo(22)); //false

再帰関数による実装

それでは、この関数のコードを書いてみましょう。実装は非常にシンプルで、再帰関数を使って実現できます。数値が2で割り切れる限り再帰を続け、その過程で最終的に1まで到達できれば2の累乗、そうでなければ2の累乗ではないと判定します。

コード例

const isPowerOfTwo = num => {
    if(num === 1){
        return true;
    };
    if(num % 2 !== 0){
        return false;
    }
    return isPowerOfTwo(num / 2);
}
console.log(isPowerOfTwo(3));
console.log(isPowerOfTwo(32));
console.log(isPowerOfTwo(2048));
console.log(isPowerOfTwo(256));
console.log(isPowerOfTwo(22));

実行結果

コンソールには次のように出力されます。

false
true
true
true
false

仕組みの解説

この関数のロジックは以下の3つのステップで構成されています。

  • ベースケース1: 数値が1であれば、1 = 2⁰ なので true を返します。
  • ベースケース2: 数値が2で割り切れない(奇数である)場合、2の累乗にはなり得ないため false を返します。
  • 再帰ステップ: それ以外の場合は、数値を2で割って再度判定を行います。

補足:ビット演算を使った別の方法

より効率的に判定したい場合は、ビット演算を利用する方法もおすすめです。2の累乗は2進数表現において「1のビットが1つだけ立っている」数値であるため、次のように1行で判定できます。

const isPowerOfTwo = num => num > 0 && (num & (num - 1)) === 0;

この方法は再帰呼び出しを行わないため、大きな数値でも定数時間 O(1) で判定できるというメリットがあります。用途に応じて、再帰による実装とビット演算による実装を使い分けるとよいでしょう。

  1. JavaScriptで配列のべき集合(パワーセット)を求める方法

    ある集合 S のべき集合(パワーセット)とは、S のすべての部分集合からなる集合のことです。空集合と S 自身も含まれ、P(S) という記号で表されます。べき集合とは?具体例たとえば、S = {x, y, z} の場合、部分集合は以下の8つになります。{   {},   {x},   {y},   {z},   {x, y},   {x, z},   {y, z},  

  2. C言語で2の累乗かどうかを判定する方法(ビット演算の活用)

    ある整数 n が与えられたとき、その数が2の累乗(べき乗)であるかどうかを判定する問題を考えてみましょう。例えば、n = 16 の場合は true を返し、n = 12 の場合は false を返します。ビット演算を使った判定方法この問題は、論理演算(ビット演算)を使うことで効率的に解くことができます。2の累乗となる数を2進数で表すと、最上位ビット(MSB)だけが1で、それ以外のビットはすべて0になります。ここで注目すべきは、「n AND (n − 1)」という計算です。n が2の累乗であれば、この演算結果は必ず0になります。具体例として n = 16 を見てみましょう。16 は2進数で「10