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

C言語で2つの整数をビット演算で再帰的に加算する方法

この問題では、2つの整数が与えられ、ビット演算を用いた再帰的な加算を行うCプログラムを作成することが課題となります。

ビット演算で加算する仕組み

ビット演算で和を求める考え方は、幼い頃に学んだ「筆算のやり方」と本質的に同じです。各桁の数字を順番に足していき、繰り上がりが発生したら、その繰り上がりを次の桁に加算します。

今回のアプローチでもまったく同じことを行います。XOR(排他的論理和)演算子で和を計算し、AND(論理積)演算で繰り上がりの有無を確認します。繰り上がりが存在すれば、それを再度数値に加算し、なければそこで処理を完了します。

実はこれは、デジタル電子回路で学ぶ半加算器(Half-Adder)と同じ論理です。半加算器について詳しく知りたい方は、こちらを参照してください。

アルゴリズムの手順

和は a^b(a XOR b)によって計算されます。両者の最下位ビットがどちらも1である場合などには、追加の繰り上がりを伝播させる必要があります。つまり、余分に立ったビットを数値に加算していく必要があるのです。

具体的なアルゴリズムは以下の通りです。

  • ステップ1 − a と b のXOR(a^b)を計算し、結果変数 result に格納します。
  • ステップ2{(a & b) << 1} が 0 と等しいかどうかを判定します。
  • ステップ2.1 − 0 に等しい場合、result を出力します。これが最終的な答えです。
  • ステップ2.2 − 0 でない場合は、a = {(a & b) << 1}b = result としてステップ1へ戻ります。

サンプルプログラム

アルゴリズムの動作を示すCプログラムは以下の通りです。

#include <stdio.h>
int addNumbers(int a, int b) {
   int carry = (a & b) << 1;
   int result = a^b;
   if (carry == 0)
      return result;
   else
      addNumbers(carry, result);
}
int main(){
   int a = 54, b = 897;
   printf("The sum of %d and %d using bitwise adding is %d", a, b, addNumbers(a, b));
   return 0;
}

実行結果

The sum of 54 and 897 using bitwise adding is 951’
  1. JavaScriptで整数リスト内の2つの数値の最大積を求める方法

    問題の概要整数の配列を唯一の引数として受け取るJavaScript関数を作成する必要があります。この関数の目的は、配列内の任意の2つの要素を掛け合わせたときに得られる最大の積を見つけることです。ただし、線形時間(O(n))かつ定数空間(O(1))で処理を完了しなければならないという条件が課されています。例入力配列が次の場合を考えてみましょう。const arr = [3, 9, 2, 1, 0];このとき、出力は次のようになります。const output = 27;これは、3と9を掛け合わせた27が最大の積となるためです。アプローチの解説最大の積が生まれるのは、次の2つのケースのいずれかです

  2. 【C言語】ビット演算子を使って2倍・半分を計算する方法

    ビット演算子は、オペランドのビット単位(2進数の各桁)に対して直接操作を行う演算子です。シフト演算を活用すると、掛け算や割り算を高速に処理できるため、組み込み開発やパフォーマンスが求められる場面でよく使われます。C言語の主なビット演算子一覧演算子説明&ビットごとのAND(論理積)|ビットごとのOR(論理和)^ビットごとのXOR(排他的論理和)<<左シフト>>右シフト~1の補数(ビット反転)AND演算の真理値表ビットごとのANDaba & b000010100111OR演算の真理値表ビットごとのORaba | b000011101111XOR演算の真理値表