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

C/C++で算術演算子を使わずに2つの整数の合計を求める方法

算術演算子(+、-、*、/ など)を使用せずに2つの整数を加算したい場合、ビット演算を活用する方法があります。AND演算で繰り上がりを検出し、XOR演算で部分和を求めるという手法を組み合わせることで、加算を実現できます。以下に具体的な実装例を示します。

サンプルコード

#include <iostream>
#include <cmath>
using namespace std;
int add(int val1, int val2) {
    while(val2 != 0) {
        int c = val1 & val2;
        val1 = val1 ^ val2;
        val2 = c << 1;
    }
    return val1;
}
int main() {
    cout <<"The sum of two numbers : "<< add(28, 8);
    return 0;
}

実行結果

The sum of two numbers : 36

プログラムの解説

上記のプログラムでは、int型の引数を2つ受け取る関数 add() を定義しています。2つの数値の加算処理は、この add() の内部でビット演算によって実現されています。

int add(int val1, int val2) {
    while(val2 != 0) {
        int c = val1 & val2;
        val1 = val1 ^ val2;
        val2 = c << 1;
    }
    return val1;
}

このアルゴリズムは、デジタル回路における加算器(フルアダー)と同じ原理に基づいており、各ステップの役割は以下の通りです。

  • val1 & val2(AND演算):両方のビットが1になっている位置で繰り上がり(キャリー)が発生することを表します。
  • val1 ^ val2(XOR演算):キャリーを考慮しない状態での部分和を計算します。
  • c << 1(左シフト):発生したキャリーを1桁左にずらし、次の加算対象として扱います。

whileループはキャリーが0になるまで繰り返され、すべての繰り上がりが処理された時点で、変数 val1 に最終的な合計値が格納されます。

main() 関数では、add(28, 8) を呼び出して計算結果を標準出力に表示しています。

cout <<"The sum of two numbers : "<< add(28, 8);
  1. 【初心者向け】C言語のポインタを使って配列要素の合計を計算する方法

    ポインタとは?ポインタ(Pointer)とは、他の変数のアドレス(メモリ上の場所)を格納するための変数のことです。例えば、次のような変数宣言を見てみましょう。int qty = 179;この場合、変数 qty には値 179 が格納されています。ポインタは、この qty が配置されているメモリ上のアドレスを保持することができます。ポインタの宣言ポインタを宣言する構文は以下の通りです。int *p;ここで p はポインタ変数であり、他の int 型変数のアドレスを保持します。宣言時には、変数名の前に間接演算子 *(アスタリスク)を付けます。ポインタの初期化ポインタ変数を初期化するには、アドレス演

  2. C言語のポインタを使って2つの行列を乗算する方法をわかりやすく解説

    ポインタ(pointer)とは、別の変数のメモリアドレスを格納するための変数です。C言語ではポインタを使うことでメモリを直接操作でき、効率的で高速なプログラムを作成できます。 ポインタの特徴 メモリ空間を節約できる。 メモリ上の位置へ直接アクセスするため、実行速度が速い。 メモリの動的な割り当てと解放が可能になり、メモリを効率的に利用できる。 リンクリストや木構造などのデータ構造と組み合わせて使用される。 ポインタの宣言・初期化・アクセス まず、次のような通常の変数宣言を考えてみましょう。 int qty = 179; この変数はメモリ上では、「qty」という名前、値「179」、そして固有