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);
-
【初心者向け】C言語のポインタを使って配列要素の合計を計算する方法
ポインタとは?ポインタ(Pointer)とは、他の変数のアドレス(メモリ上の場所)を格納するための変数のことです。例えば、次のような変数宣言を見てみましょう。int qty = 179;この場合、変数 qty には値 179 が格納されています。ポインタは、この qty が配置されているメモリ上のアドレスを保持することができます。ポインタの宣言ポインタを宣言する構文は以下の通りです。int *p;ここで p はポインタ変数であり、他の int 型変数のアドレスを保持します。宣言時には、変数名の前に間接演算子 *(アスタリスク)を付けます。ポインタの初期化ポインタ変数を初期化するには、アドレス演
-
C言語のポインタを使って2つの行列を乗算する方法をわかりやすく解説
ポインタ(pointer)とは、別の変数のメモリアドレスを格納するための変数です。C言語ではポインタを使うことでメモリを直接操作でき、効率的で高速なプログラムを作成できます。 ポインタの特徴 メモリ空間を節約できる。 メモリ上の位置へ直接アクセスするため、実行速度が速い。 メモリの動的な割り当てと解放が可能になり、メモリを効率的に利用できる。 リンクリストや木構造などのデータ構造と組み合わせて使用される。 ポインタの宣言・初期化・アクセス まず、次のような通常の変数宣言を考えてみましょう。 int qty = 179; この変数はメモリ上では、「qty」という名前、値「179」、そして固有