算術演算子を使わずにC/C++で2つの数値を加算する方法
この記事では、+、++、-、-- などの算術演算子を使用せずに、2つの数値を加算する方法を解説します。
この問題は、バイナリ加算器(Binary Adder)のロジックを応用することで解決できます。デジタル回路の分野では、1ビットの2進数を加算するための「半加算器(Half Adder)」や「全加算器(Full Adder)」が古くから設計されてきました。これらの加算器を複数段にカスケード接続すれば、より大きな桁数の数値を扱える加算回路を構成できます。
加算器の内部では、まず2つの数値同士でXOR演算を行い、繰り上がり(キャリー)についてはAND演算によって求めます。ここでは、この仕組みをそのままソフトウェアとして実装し、2つの整数の加算を実現します。
アルゴリズムのポイント
- XOR(^):繰り上がりを考慮しない部分和を求める
- AND(&):繰り上がりが発生するビット位置を特定する
- 左シフト(<< 1):繰り上がりを1ビット左に移動させ、次の桁へ反映させる
繰り上がりが0になるまでこれらの処理を繰り返すことで、最終的に変数 a に正しい合計値が格納されます。
サンプルコード
#include <iostream>
using namespace std;
int add(int a, int b) {
while (b != 0) { // 繰り上がりがなくなるまで繰り返す
int carry = a & b; // AND演算で繰り上がりを求める
a = a ^ b; // XOR演算の結果をaに格納
b = carry << 1; // 繰り上がりを1ビット左シフトしてbに格納
}
return a;
}
int main() {
int a, b;
cout << "Enter two numbers to add: ";
cin >> a >> b;
cout << "The result is: " << add(a, b);
return 0;
}
実行結果
Enter two numbers to add: 56 23 The result is: 79
-
PHPのbcadd()関数を使って2つの任意精度数値を加算する方法
PHPでは、bcadd()という数学関数を使用することで、2つの任意精度(多倍長精度)の数値を正確に加算できます。bcadd()関数は、任意精度の2つの数値を文字列として受け取り、指定された桁数(スケール)に結果を揃えたうえで、その合計値を返します。通常の浮動小数点演算では発生しうる誤差を回避できるため、金額計算など高い精度が求められる場面で特に役立ちます。この関数を使用するには、PHPにBCMath拡張モジュールがインストールされている必要があります。構文string bcadd ( $num_str1, $num_str2, $scaleVal)パラメータbcadd()関数は、$num_s
-
C#で一時変数を使わずに2つの数値を入れ替える方法(算術演算子を活用)
C#で2つの変数の値を入れ替える(スワップする)場合、通常は一時変数(テンポラリ変数)を使用します。しかし、算術演算子を活用することで、一時変数なしでも値の交換が可能です。基本的な考え方まず、入れ替え対象となる2つの変数を用意します。val1 = 5; val2 = 10;次に、加算と減算を組み合わせた以下の手順で値を入れ替えます。val1 = val1 + val2; // val1に両方の合計を代入 val2 = val1 - val2; // 合計から元のval2を引くと、元のval1が残る val1 = val1 - val2; // 合計から新しいval2(元のval1)を引く