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

C++でビット演算を使って2つの符号なし整数を加算する方法

はじめに

ビット列として表現される符号なし整数は、2進数形式で記述されます。例えば、54の2進表現は「110110」です。

ビットを用いて2つの数を加算する場合、2進数の加算ロジックに従って、それぞれの2進表現を桁ごとに足し合わせていきます。

ビット加算の基本ルール

  • 0 + 0 = 0
  • 1 + 0 = 1
  • 0 + 1 = 1
  • 1 + 1 = 0(繰り上がり = 1)

具体例

実際に2つの数を加算する例を見てみましょう。

入力: a = 21 (10101)、b = 27 (11011)
出力: 48 (110000)

解説: 10101 + 11011 = 110000 となります。加算は最下位ビット(LSB)から開始し、繰り上がりを次の桁へ伝播させながら処理を進めます。

C++での実装例

C++では bitset を使うことで、数値をビット列として扱えます。以下は、bitsetを利用して2つの符号なし整数をビット単位で加算するサンプルコードです。

#include <bits/stdc++.h>
#define M 32
using namespace std;
int binAdd (bitset < M > atemp, bitset < M > btemp){
   bitset < M > ctemp;
   for (int i = 0; i < M; i++)
      ctemp[i] = 0;
   int carry = 0;
   for (int i = 0; i < M; i++) {
      if (atemp[i] + btemp[i] == 0){
         if (carry == 0)
            ctemp[i] = 0;
         else {
            ctemp[i] = 1;
            carry = 0;
         }
      }
      else if (atemp[i] + btemp[i] == 1){
         if (carry == 0)
            ctemp[i] = 1;
         else{
            ctemp[i] = 0;
         }
      }
      else{
         if (carry == 0){
            ctemp[i] = 0;
            carry = 1;
         }
         else{
            ctemp[i] = 1;
         }
      }
   }
   return ctemp.to_ulong ();
}
int main () {
   int a = 678, b = 436;
   cout << "The sum of " << a << " and " << b << " is ";
   bitset < M > num1 (a);
   bitset < M > num2 (b);
   cout << binAdd (num1, num2) << endl;
}

コードのポイント

このプログラムでは、32ビット分の bitset を用意し、各ビット位置ごとに加算結果と繰り上がり(carry)を管理しています。2つのビットの和が2になった場合に繰り上がりを発生させ、最終的な結果は to_ulong() で整数値へ変換して返します。

出力結果

The sum of 678 and 436 is 1114

このように、ビット演算のロジックを実装することで、算術演算子を使わずに2つの符号なし整数の加算を実現できます。低レベルな演算処理の理解や、組み込み開発などでの応用にも役立つテクニックです。

  1. C++で2つの数値を加算するプログラムの書き方【サンプルコード付き】

    加算(足し算)は、最も基本的な算術演算の一つです。2つの数値を加算するプログラムは、指定された2つの数値の合計を計算し、その結果を画面に表示します。この記事では、C++で2つの数値を加算する方法を、変数を使った基本例と配列を使った応用例の2パターンに分けて解説します。例1:変数を使って2つの数値を加算するまずは、最もシンプルな方法です。2つの整数型変数を用意し、その合計を別の変数に格納して出力します。#include <iostream> using namespace std; int main() { int num1 = 15, num2 = 10, sum;

  2. Pythonで連結リストとして表された2つの数値を加算する方法

    問題概要空でない連結リストが2つ与えられ、それぞれが非負の整数を表しているものとします。桁は逆順に格納されており、各ノードには1桁の数字のみが含まれています。この2つの数値を足し合わせ、その結果を連結リストとして返すのが課題です。ただし、数値0自体を除き、先頭に余分なゼロ(leading zeros)は含まれないものと仮定します。例えば、120 + 230 を計算する場合、連結リストは次のように表されます。[0 → 2 → 1] + [0 → 3 → 2] = [0 → 5 → 3] = 350解法のアルゴリズムこの問題は、筆算と同じ要領で各桁を順番に足していき、繰り上がり(carry)を管理