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

JavaScriptで10進数のビットを反転して新しい10進数を求める方法

はじめに

本記事では、JavaScriptを使って「10進数を2進数に変換し、すべてのビットを反転させ、その結果を再び10進数として返す」関数の実装方法を解説します。

問題の定義

私たちが作成すべきのは、以下の処理を行うJavaScript関数です。

  • 引数として10進数を受け取る
  • その数値を2進数(文字列)に変換する
  • 各ビットを反転する(1なら0へ、0なら1へ)
  • 反転後の2進数を10進数に戻して返す

実装コード

以下が実際のコード例です。

const num = 45657;

const reverseBitsAndConvert = (num = 1) => {
  // 数値を2進数の文字列に変換
  const binary = num.toString(2);

  let newBinary = '';
  // 各ビットを走査して反転
  for (let i = 0; i < binary.length; i++) {
    const bit = binary[i];
    newBinary += bit === '1' ? '0' : '1';
  }

  // 反転後の2進数を10進数に戻す
  const decimal = parseInt(newBinary, 2);
  return decimal;
};

console.log(reverseBitsAndConvert(num));

実行結果

19878

入力値 45657 の2進表現は 1011001010011001 です。これをビットごとに反転すると 0100110101100110 となり、これを10進数に変換すると 19878 が得られます。

コードの解説

1. 2進数への変換

num.toString(2) を使うことで、数値を基数2の文字列に簡単に変換できます。例えば (5).toString(2)"101" を返します。

2. ビットの反転

forループで2進数の文字列を先頭から順に走査し、'1' であれば '0' へ、そうでなければ '1' へ置き換えて新しい文字列を組み立てています。

3. 10進数への復元

parseInt(newBinary, 2) の第2引数に基数 2 を指定することで、2進数の文字列を正しく10進数の数値に変換できます。

より簡潔な代替実装

モダンな配列メソッドを使えば、同じ処理をより簡潔に書くことも可能です。

const reverseBitsAndConvert = (num = 1) =>
  parseInt(
    num
      .toString(2)
      .split('')
      .map(bit => (bit === '1' ? '0' : '1'))
      .join(''),
    2
  );

console.log(reverseBitsAndConvert(45657)); // 19878

split('') で文字列を1文字ずつの配列に分解し、map() で各ビットを反転させた後、join('') で再び文字列に結合しています。可読性が高く、意図も伝わりやすい実装です。

まとめ

このように、toString(2) による2進数への変換と parseInt(x, 2) による復元を組み合わせれば、ビット反転のような操作も文字列処理として直感的に実装できます。ループ構文でも配列メソッドでも目的は達成できるので、プロジェクトのコーディングスタイルに合わせて選択するとよいでしょう。

  1. JavaScriptで数値の小数部分を削除する方法|Math.trunc()の使い方

    JavaScriptで数値の小数部分を削除するには、Math.trunc()メソッドを使用します。このメソッドは、小数点以下を切り捨て、数値の整数部分のみを返します。基本的な使い方以下の例では、小数を含む数値「4.5」から小数部分を削除し、整数部分だけを出力しています。<!DOCTYPE html> <html>    <body>       <p>値:</p>       <script>       &nbs

  2. JavaScriptのnew.targetメタプロパティとは?使い方をわかりやすく解説

    JavaScriptのnew.targetとはnew.targetは、関数やコンストラクタが実行時にnewキーワードを使って呼び出されたかどうかを判定できるメタプロパティです。通常、関数をnewをつけずに呼び出すと、コンストラクタとして意図された関数でも単なる通常の関数として実行されてしまい、グローバルオブジェクトにプロパティが設定されるなどの予期しない動作を引き起こす可能性があります。new.targetを利用することで、このような誤用を検出し、エラーとして通知することができます。new演算子とともに呼び出された場合、new.targetは呼び出されたコンストラクタ自身への参照を返します。一