「-」記号を使わずにJavaScriptで2つの数値の差を求める方法
本記事では、マイナス(-)記号を一切使用せずに、2つの数値の差(引き算の結果)を返すJavaScript関数の実装方法を解説します。
アプローチ:ビット演算を活用する
「-」演算子が使えない場合でも、ビット演算を組み合わせることで減算を実現できます。鍵となるのは次の2つの演算です。
- XOR(^):借り(ボロー)を考慮しない減算結果を一時的に得る
- NOT(~)とAND(&):必要な借りを計算し、1ビット左シフトして次のステップへ渡す
この処理を再帰的に繰り返し、借りがなくなる(第2引数が0になる)まで続けることで、最終的な差を求められます。
コード例
以下がその実装コードです。
const num1 = 56;
const num = 78;
const subtractWithoutMinus = (num1, num2) => {
if(num2 === 0){
return num1;
};
return subtractWithoutMinus(num1 ^ num2, (~num1 & num2) << 1);
};
console.log(subtractWithoutMinus(num, num1));出力結果
コンソールには以下の出力が表示されます。
22
処理の流れを解説
このコードでは「78 - 56」を計算しています。各再帰ステップでは以下のような動作が行われています。
- num1 ^ num2 により、借りのない減算結果を取得する
- (~num1 & num2) << 1 により、実際に必要な借りを計算し、次の呼び出しに引き継ぐ
- num2 が 0 になった時点で、num1 に最終的な差が格納されているため、それを返して再帰を終了する
このように、XOR・NOT・ANDといったビット演算と再帰を組み合わせることで、「-」記号に一切頼らずに減算を実現できます。同様の考え方は加算にも応用でき、アルゴリズムやビット操作への理解を深める定番の練習問題としても知られています。
-
JavaScriptで2つの数値を加算する際に必要な繰り上がり(キャリー)の回数を求める方法
問題 2つの数値を受け取るJavaScriptの関数を記述する必要があります。 この関数は、まるで紙の上で筆算を行うように、その2つの数値を加算する際に発生する繰り上がり(キャリー)の回数を数えて返すものとします。 例えば、次の図のように 179 と 284 を足し合わせる場合、繰り上がりは2回発生します。したがって、この2つの数値を渡したとき、関数は 2 を返す必要があります。 解き方のポイント この問題は、各桁を下の位から順番に見ていき、「その桁の2つの数字と、前の桁からの繰り上がりの合計が10以上になったかどうか」を判定することで解けます。 剰余演算子(%)を使えば、数値の一番下の
-
C#でメソッドを使わずに2つの2進数の合計を求める方法
この記事では、C#において組み込みメソッドを使用せずに、2つの2進数の合計を求める方法を解説します。剰余演算とループ処理を組み合わせることで、各桁を手動で加算していくアプローチを紹介します。手順1:変数の宣言と初期化まず、2進数を格納する2つの変数を宣言し、初期化します。val1 = 11010; val2 = 10100; Console.WriteLine(Binary one: + val1); Console.WriteLine(Binary two: + val2);手順2:ループで各桁を加算する合計を求めるには、両方の値が0になるまでループ処理を続けます。各反復処理の中で、最