C++で数値を2進数表現に変換する方法【再帰処理を解説】
2進数(バイナリ数)とは、0と1という2つの数字のみで構成される数値表現のことです。例えば、01010111 のような形で表されます。コンピュータの内部では、すべてのデータがこの2進数として扱われています。
ある数値を2進数形式で表現する方法はいくつかあります。本記事では、代表的な「再帰を使った方法」を中心に解説します。
再帰を用いた方法
この方法では、再帰呼び出しを利用して数値を2進数形式で表現します。数値を2で割り続けながら、その余りを順に出力していくことで、2進数表現を得ることができます。
アルゴリズム
ステップ1: 数値が1より大きい場合、ステップ2とステップ3を実行します。 ステップ2: 数値をスタックにプッシュします。 ステップ3: 引数を number/2 として関数を再帰的に呼び出します。 ステップ4: スタックから数値をポップし、2で割った余りを出力します。
コード例
#include<iostream>
using namespace std;
void tobinary(unsigned number){
if (number > 1)
tobinary(number/2);
cout << number % 2;
}
int main(){
int n = 6;
cout<<"The number is "<<n<<" and its binary representation is ";
tobinary(n);
n = 12;
cout<<"\nThe number is "<<n<<" and its binary representation is ";
tobinary(n);
}
実行結果
The number is 6 and its binary representation is 110 The number is 12 and its binary representation is 1100
仕組みの解説
このプログラムでは、関数 tobinary が再帰的に呼び出されます。例えば n = 6 の場合、処理の流れは次のようになります。
tobinary(6) → tobinary(3) → tobinary(1) と呼び出しが深くなり、その後呼び出しから戻りながら「6 % 2 = 0」「3 % 2 = 1」「1 % 2 = 1」の順に出力されます。その結果、画面には「110」が表示されます。同様に n = 12 の場合は「1100」と出力されます。
補足: std::bitset を使った方法
C++では、標準ライブラリの std::bitset を使うことで、より簡単に2進数表現を取得することもできます。桁数を指定できるため、固定幅のビット表現が必要な場合に便利です。
#include<iostream>
#include<bitset>
int main(){
int n = 6;
std::cout << std::bitset<8>(n) << std::endl; // 出力: 00000110
return 0;
}
再帰処理はアルゴリズムの学習に最適であり、std::bitset は実務で手軽に使える方法です。目的に応じて使い分けるとよいでしょう。
-
C++で二分木がSumTree(総和木)かどうかを判定する方法
ここでは、与えられた二分木が「SumTree(総和木)」であるかどうかを判定する方法を解説します。まずは、SumTreeとはどのような木なのかを確認しておきましょう。 SumTreeとは SumTreeとは、すべての内部ノードが「左の子と右の子の値の合計」を保持する特殊な二分木です。木の根(ルート)には、それより下位に存在する全要素の合計値が格納されます。なお、葉ノードのみからなる木や空の木も、定義上はSumTreeとみなされます。以下はSumTreeの一例です。 例えば上図の木では、根の値26が左部分木(10 + 4 + 6 = 20)と右部分木(3 + 3 = 6)の合計と一致しており
-
C++で8進数を2進数に変換するプログラムの書き方【サンプルコード付き】
コンピュータシステムにおいて、2進数は2を基数とする記数法(二進法)で表現され、8進数は8を基数とする記数法(八進法)で表現されます。2進数は0と1のみを使用するのに対し、8進数は0から7までの数字を使用します。 2進数とそれに対応する8進数の例は以下の通りです。 2進数8進数 0110115 001015 1011026 0101012 以下に、8進数を2進数に変換するC++プログラムを示します。 サンプルプログラム #include <iostream> #include <cmath> using namespace std; int OctalToBi