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

C++の再帰プログラムによる2進数から10進数への変換

はじめに

本記事では、2進数を表す文字列が与えられたときに、再帰(リカージョン)を用いて等価な10進数を求めるC++プログラムを解説します。

2進数を10進数に変換する基本的な方法は以下の通りです。

最下位ビット(LSB)から最上位ビット(MSB)へ向かって各桁を走査し、それぞれの桁の値に 2i(0 ≤ i ≤ 桁数)を掛け合わせて、それまでの結果に加算していきます。

入出力のシナリオ例

例1

入力 − binStr[] = "110010"

出力 − 与えられた2進数に相当する10進数:50

説明 − 110010 を10進数に変換すると次のようになります。

= 0×20 + 1×21 + 0×22 + 0×23 + 1×24 + 1×25

= 0 + 2 + 0 + 0 + 16 + 32

= 50

例2

入力 − binStr[] = "0011"

出力 − 与えられた2進数に相当する10進数:3

説明 − 0011 を10進数に変換すると次のようになります。

= 1×20 + 1×21 + 0×22 + 0×23

= 1 + 2 + 0 + 0

= 3

プログラムで使用するアプローチ

このアプローチでは、入力文字列とその長さを受け取る再帰関数 bintoDecimal(strBin, length) を使用します。各文字を10進数の値に変換し、2i を掛けて、それまでの結果に加算していきます。

  • 2進数を格納した入力文字列 strBin[] を受け取ります。
  • strlen(strBin) を使って文字列の長さを計算します。
  • 関数 bintoDecimal(strBin, length) は入力を受け取り、再帰的な手法で計算した数値を返します。
  • 現在見ている文字が最後の文字(LSB)であれば、その桁は 20 = 1 倍と同じなので、そのまま10進数の値を返します。
  • それ以外の場合は、temp = binary[i] - '0' として文字を対応する数値に変換します。
  • 続いて、シフト演算 temp << len-i-1 を用いて temp に 2len-i-1 を掛けます。
  • temp = temp + bintoDecimal(binary, len, i+1) のようにして、残りの桁の計算結果を temp に加算します。
  • 再帰の終端で temp を返します。
  • main 関数内で計算された10進数の値を出力します。

コード例

#include<bits/stdc++.h>
using namespace std;
int bintoDecimal(char binary[],int len, int i=0){
   if (i == len-1)
   return (binary[i] - '0');

   int temp=binary[i]-'0';
   temp=temp<<len-i-1;
   temp=temp+bintoDecimal(binary,len,i+1);
   return (temp);
}
int main(){
   char strBin[] = "11010";
   int length=strlen(strBin);
   cout <<"与えられた2進数に相当する10進数: "<<bintoDecimal(strBin,length) << endl;
   return 0;
}

出力結果

上記のコードを実行すると、次の出力が得られます。

与えられた2進数に相当する10進数: 26

まとめ

このように、再帰関数とビットシフト演算を組み合わせることで、ループ処理を使わずに簡潔に2進数から10進数への変換を実装できます。再帰の基底条件(最後の文字に到達した場合)と、各桁の重み付け(2のべき乗)を正しく扱うことがポイントです。

  1. C++で2進数を10進数に変換するプログラムの作り方

    2進数が入力として与えられたとき、その2進数を10進数へ変換するのが本記事のテーマです。 コンピュータにおける10進数は基数10で表現されます。一方、2進数は基数2で表現され、使用するのは0と1という2つの数字だけです。それに対して10進数では、0から9までの任意の数字を扱うことができます。 2進数を10進数に変換するには、右端の桁から順に各桁の数字を取り出し、2のべき乗(0乗から始まり、桁数-1乗まで1ずつ増加)を掛け合わせます。そして、その掛け算の結果をすべて足し合わせることで、最終的な10進数の値が求まります。 以下は、2進数を10進数に変換する流れを図で表したものです。 具体例 入

  2. C++でピラミッドの体積を計算するプログラムの作り方|底面の形状別の公式と実装例

    ピラミッドの底面の種類に応じた辺の長さが与えられたとき、そのピラミッドの体積を計算するのが本記事のテーマです。 ピラミッドとは、外側の面がすべて三角形で構成され、それらが共通の一点(頂点)で交わることで鋭い角を形成する3次元図形です。ピラミッドの体積は、底面がどのような形状であるかによって異なります。 ピラミッドの底面にはさまざまな種類があり、代表的なものは以下の通りです。 底面の形状別の体積の求め方 三角形の底面(三角錐) 底面が三角形の場合、ピラミッドの体積は次の公式で求められます。 体積 = (1/6) × a × b × h 正方形の底面(四角錐) 底面が正方形の場合、ピラミッドの体