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つの符号なし整数の加算を実現できます。低レベルな演算処理の理解や、組み込み開発などでの応用にも役立つテクニックです。
-
C++で2つの数値を加算するプログラムの書き方【サンプルコード付き】
加算(足し算)は、最も基本的な算術演算の一つです。2つの数値を加算するプログラムは、指定された2つの数値の合計を計算し、その結果を画面に表示します。この記事では、C++で2つの数値を加算する方法を、変数を使った基本例と配列を使った応用例の2パターンに分けて解説します。例1:変数を使って2つの数値を加算するまずは、最もシンプルな方法です。2つの整数型変数を用意し、その合計を別の変数に格納して出力します。#include <iostream> using namespace std; int main() { int num1 = 15, num2 = 10, sum;
-
Pythonで連結リストとして表された2つの数値を加算する方法
問題概要空でない連結リストが2つ与えられ、それぞれが非負の整数を表しているものとします。桁は逆順に格納されており、各ノードには1桁の数字のみが含まれています。この2つの数値を足し合わせ、その結果を連結リストとして返すのが課題です。ただし、数値0自体を除き、先頭に余分なゼロ(leading zeros)は含まれないものと仮定します。例えば、120 + 230 を計算する場合、連結リストは次のように表されます。[0 → 2 → 1] + [0 → 3 → 2] = [0 → 5 → 3] = 350解法のアルゴリズムこの問題は、筆算と同じ要領で各桁を順番に足していき、繰り上がり(carry)を管理