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

JavaScriptで数値を最も近い2の累乗に四捨五入する方法

JavaScriptでは、数値を引数として受け取り、その数値に最も近い「2の累乗」を返す関数を求められることがあります。ビット演算やメモリサイズの計算など、さまざまな場面で役立つ処理です。

例えば、入力された数値が 145 の場合を考えてみましょう。145 に最も近い 2^n(n は整数)の形で表せる数は 128(2^7)です。したがって、この場合の出力は 128 となります。

実装コード

以下がその実装例です。

const num = 145;
const nearestPowerOfTwo = num => {
    // 負の数には対応しないため、絶対値に変換
    if(num < 0){
        num *= -1;
    }
    let base = 1;
    while(base < num){
        // 現在のbaseと次のbaseのどちらが近いかを判定
        if(num - base < Math.floor(base / 2)){
            return base;
        };
        base *= 2;
    };
    return base;
};
console.log(nearestPowerOfTwo(num));

実行結果

コンソールへの出力は以下のようになります。

128

コードの解説

このアルゴリズムの仕組みを簡単に説明します。

1. 負の数への対応: まず、入力値が負の場合は絶対値に変換します。これにより、負の数が渡されても正しく動作します。

2. base の初期化: 変数 base を 1(つまり 2^0)で初期化し、ここから順に 2 倍ずつ増やしていきます。

3. 近さの判定: ループの中で、「現在の base」と「次の base(base × 2)」のどちらが入力値に近いかを判定します。具体的には、num - baseMath.floor(base / 2) より小さい場合、入力値は現在の base に近いと判断できます。これは、隣接する2つの累乗の中間点が base + base / 2 = base × 1.5 になるためです。

4. ループ終了時: 入力値そのものが累乗であるか、それ以上の累乗に達した場合は、ループを抜けた時点の base をそのまま返します。

別のアプローチ:ビットシフトを使う方法

より簡潔に書きたい場合は、ビット長を利用する方法もあります。

const nearestPowerOfTwo = num => {
    if (num <= 1) return 1;
    const lower = Math.pow(2, Math.floor(Math.log2(num)));
    const upper = lower * 2;
    return (num - lower) < (upper - num) ? lower : upper;
};
console.log(nearestPowerOfTwo(145)); // 128

こちらの方法では、Math.log2() で入力値の対数(底2)を求め、その下限・上限となる累乗を計算して、どちらが近いかを比較しています。大きな数値でも高速に動作するのが特徴です。

  1. JavaScriptで数値を丸める・切り捨てる方法|Math.round()とMath.trunc()の違いと使い方

    JavaScriptには、小数を整数へ変換するためのメソッドとして、Math.round() と Math.trunc() の2つが標準で用意されています。Math.round():小数点以下を四捨五入し、最も近い整数に丸めます。例えば「3.5」は「4」に、「3.4」は「3」になります。Math.trunc():小数点以下を単純に取り除き、整数部分だけを残します。「3.9」も「3.1」もどちらも「3」になります。それぞれの特徴を踏まえながら、実際のコード例を見ていきましょう。Math.round() と Math.trunc() の違いメソッド動作例(3.999)Math.round()四捨五

  2. JavaScriptで数値に序数接尾辞(st・nd・rd・th)を追加する方法

    問題JavaScriptで関数を作成する必要があります。この関数は、数値 num を最初の(唯一の)引数として受け取ります。関数の役割は、英語の序数表記のルールに従って、数値に「st」「nd」「rd」「th」という接尾辞を追加することです。具体的なルールは以下の通りです。一の位が1で終わる数値には「st」を使用します(例:1st、発音はfirst)一の位が2で終わる数値には「nd」を使用します(例:92nd、発音はninety-second)一の位が3で終わる数値には「rd」を使用します(例:33rd、発音はthirty-third)上記ルールの例外として、下二桁が11・12・13となる数値に