C で 2 進数を 10 進数に変換する
 
この記事では、2 進数を 10 進数に変換する複数の C 実装について包括的に説明します。 ただし、実装に飛び込む前に、避けられない変換基盤を探す必要があります。
C で 2 進数を 10 進数に変換する
2 進数には、0 と 1 の 2つの値のみを含めることができます。
2 進数 (0,1) 表記はコンピューター ハードウェアに固有のものですが、10 進数値は人間が簡単に理解できる整数値です。
換算方法
2 進数の 0101 は 10 進数の 5 に相当します。 次の式で説明されているように、2 進数から 10 進数への変換方法は非常に簡単です。
ここで、B は完全な 2 進数で、B_{i} は指定された 2 進数の i^th^ ビットを表します。 n は、指定された 2 進数の合計ビット数を表します。
上記の式を 2 進数 0101 に適用してみましょう。 左から右に合計すると、次のようになります。
電子回路には信号と論理ゲートがあるため、バイナリ言語はハードウェア側で使用されます。 システムで簡単に理解できます。 2 進数の 0 または 1 はすべて 1 ビットと呼ばれます。
2 進数を 10 進数に変換するアルゴリズム
この変換の問題を解決するための段階的な手順を見てみましょう。
- プログラムを開始します。
- 入力として 2 進数を取ります。
- 数値が 0 より大きい場合は、その数値を 10 で割り、剰余と 2*iの積をとります。ここで、iはゼロから始まります。
- 手順 3 で説明した商の分割を続け、各反復で iを 1 ずつ増やします。
- すべての製品を合計し、結果を返します。
この問題に対応するための実装の選択肢は複数あります。 これらのアプローチについて、1つずつ説明していきましょう。
方法 1: ループ変数と整数変数を使用して変換する
for および while ループは、2 進数を 10 進数に変換できます。
while ループを使用する
このアプローチでは、除算演算によって 2 進数が 10 進数に変換されます。
#include <math.h>
#include <stdio.h>
int main() {
  int binary_number;
  printf("Enter Binary number: ");
  scanf("%d", &binary_number);
  int decimal = 0, temp = 0, reminder;
  while (binary_number != 0) {
    reminder = binary_number % 2;
    binary_number = binary_number / 10;
    decimal = decimal + reminder * (int)pow(2, temp);
    temp++;
  }
  printf("Decimal number is : %d", decimal);
  return 0;
}
main() の最初の行では、バイナリ入力を受け取るために binary_number という名前の変数を宣言しています。 2 進数の入力を取得した後、さらに 3つの変数を宣言します。
- decimal: 結果の 10 進数値を格納します。
- temp: 反復カウンターとして機能する
- 剰余: 各反復の剰余を格納する
各 while ループ反復では、最初に binary_number から右端のビットを決定し、remainder 変数に保存します。
次に、binary_number を 10 で割り、その結果をそれ自体に上書きします。 これにより、binary_number の右端のビットが失われます。
さらに、この記事の冒頭で説明したように、重み付けされた製品を decimal 変数に集計する数式を適用します。 最後に、結果の 10 進数に相当する値を出力します。
出力を見てみましょう。

for ループを使用する
両方のループ (for と while) の基本構造は似ています。 for ループを使用する利点は、変数の宣言と初期化を 1 行で行えることです。
for ループを使用して 2 進数を 10 進数に変換する別のプログラムを次に示します。
#include <stdio.h>
int main() {
  int binary, decimal = 0, base = 1, remainder, temp;
  printf("Enter binary number: ");
  scanf("%d", &binary);
  for (temp = binary; temp > 0; temp = temp / 10) {
    remainder = temp % 2;
    decimal = decimal + remainder * base;
    base = base * 2;
  }
  printf("Decimal number is:%d", decimal);
  return 0;
}
for ループの実装では、while ループとは少し異なるアプローチを使用しました。
コストのかかる pow() 関数を使用する代わりに、各反復で 2 の値で自分自身を乗算する変数 base を作成しました。 これにより、i^th^ 反復の開始時に、base 変数が 2^i^ に相当する値を持つことが保証されます。ここで、i はゼロから始まります。
出力:

方法 2: 手続き型アプローチを使用する
このメソッドは、ユーザー定義のプロシージャまたは関数を使用して変換の問題を解決します。 コードをより再利用可能でモジュール化したい場合は、このアプローチが最も望ましい方法です。
#include <math.h>
#include <stdio.h>
int binarytodecimal(int binary_number) {
  int decimal = 0, temp = 0, remainder;
  while (binary_number != 0) {
    remainder = binary_number % 2;
    decimal = decimal + (remainder * pow(2, temp));
    binary_number = binary_number / 10;
    temp++;
  }
  return decimal;
}
int main() {
  int binary_number, decimal;
  printf("Enter binary number: ");
  scanf("%d", &binary_number);
  decimal = binarytodecimal(binary_number);
  printf("Decimal Number is: %d", decimal);
  return 0;
}
変換コード全体を 1つのプロシージャ binarytodecimal() に含めたことを除いて、すべてが前の方法と同じです。

方法 3: char 配列を使用して 2 進数を格納する
前述のすべての方法で、主な問題は整数のサイズです。 整数エンコードで 2 進数を格納していました。
したがって、16 ビット コンパイラの場合、提供できる最大数は 111111 でした。
より大きな整数サイズの 32 ビット および 64 ビット コンパイラーは、確実に入力範囲を拡大し、問題を解決します。 ただし、この問題は古いバージョンで私たちを怖がらせるでしょう.
幸いなことに、この問題に対処するためのハックがあります。つまり、動的な char 配列を使用して、整数変数の代わりに 2 進数を格納します。 戦略を理解するために、次のコードを見てみましょう。
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
  long decimal = 0;
  int size;
  printf("\nEnter maximum number of digits in your Binary number: ");
  scanf("%d", &size);
  char* BinaryArr = (char*)malloc(size + 1);
  printf("Please Enter your Binary Number: ");
  scanf("%s", BinaryArr);
  char ch;
  for (int i = size - 1, j = 0; i >= 0; i--, j++) {
    ch = BinaryArr[i];
    decimal += atoi(&ch) * (int)pow(2, j);
  }
  printf("The equivalent decimal number is: %d", decimal);
  return 0;
}
まず、10 進数に変換したい 2 進数のサイズをユーザーに確認してもらいます。
2 進数のサイズがわかっている場合は、malloc() 関数を使用してそのサイズの配列を動的に割り当てます。 malloc() は stdlib.h で定義され、動的メモリをバイト単位で割り当てます。
文字配列にするために、malloc() の戻りポインタを明示的に char* 型に型キャストしました。
注:
malloc(size +1)の余分な1は、最後に\0文字を格納するスペースが必要なためです。
次に、文字ポインタ BinaryArr が指す文字配列の入力として 2 進数を取ります。
その後、最後のインデックス (つまり、2 進数の最下位ビット) からこの文字配列の反復を開始し、反復ごとにインデックス 0 に近づくバイナリ文字を 1つずつ取得します。
各反復で i^th^ インデックスを補助 ch 変数に格納します。 次に、atoi() 関数を適用して、同等の整数値を取得します。
次に、この記事の冒頭で説明した式にすべてを入れます。
最後に、ループが終了するとすぐに、最終的な 10 進数値を出力します。 出力コンソールでどのように感じられるか見てみましょう。
