C で 2 進数を 10 進数に変換する

Muhammad Hashim Safder 2024年2月15日
  1. C で 2 進数を 10 進数に変換する
  2. 方法 1: ループ変数と整数変数を使用して変換する
  3. 方法 2: 手続き型アプローチを使用する
  4. 方法 3: char 配列を使用して 2 進数を格納する
C で 2 進数を 10 進数に変換する

この記事では、2 進数を 10 進数に変換する複数の C 実装について包括的に説明します。 ただし、実装に飛び込む前に、避けられない変換基盤を探す必要があります。

C で 2 進数を 10 進数に変換する

2 進数には、0 と 1 の 2つの値のみを含めることができます。

2 進数 (0,1) 表記はコンピューター ハードウェアに固有のものですが、10 進数値は人間が簡単に理解できる整数値です。

換算方法

2 進数の 0101 は 10 進数の 5 に相当します。 次の式で説明されているように、2 進数から 10 進数への変換方法は非常に簡単です。

$$ DecimalEquivalent =\sum_{i=0}^{n-1}\left(B_{i} \times 2^{i}\right) $$

ここで、B は完全な 2 進数で、B_{i} は指定された 2 進数の i^th^ ビットを表します。 n は、指定された 2 進数の合計ビット数を表します。

上記の式を 2 進数 0101 に適用してみましょう。 左から右に合計すると、次のようになります。

$$ DecimalEquivalent \ of\ (0101)_{2} = 0×2^3 + 1×2^2 + 0×2^1 + 1×2^0 \\ = 0 + 4 + 0 + 1 \\ = 5 $$

電子回路には信号と論理ゲートがあるため、バイナリ言語はハードウェア側で使用されます。 システムで簡単に理解できます。 2 進数の 0 または 1 はすべて 1 ビットと呼ばれます。

2 進数を 10 進数に変換するアルゴリズム

この変換の問題を解決するための段階的な手順を見てみましょう。

  1. プログラムを開始します。
  2. 入力として 2 進数を取ります。
  3. 数値が 0 より大きい場合は、その数値を 10 で割り、剰余と 2*i の積をとります。ここで、i はゼロから始まります。
  4. 手順 3 で説明した商の分割を続け、各反復で i を 1 ずつ増やします。
  5. すべての製品を合計し、結果を返します。

この問題に対応するための実装の選択肢は複数あります。 これらのアプローチについて、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つの変数を宣言します。

  1. decimal: 結果の 10 進数値を格納します。
  2. temp: 反復カウンターとして機能する
  3. 剰余: 各反復の剰余を格納する

while ループ反復では、最初に binary_number から右端のビットを決定し、remainder 変数に保存します。

次に、binary_number を 10 で割り、その結果をそれ自体に上書きします。 これにより、binary_number の右端のビットが失われます。

さらに、この記事の冒頭で説明したように、重み付けされた製品を decimal 変数に集計する数式を適用します。 最後に、結果の 10 進数に相当する値を出力します。

出力を見てみましょう。

Whileループ

for ループを使用する

両方のループ (forwhile) の基本構造は似ています。 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 はゼロから始まります。

出力:

For ループ

方法 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 進数値を出力します。 出力コンソールでどのように感じられるか見てみましょう。

配列メソッドの出力

関連記事 - C Binary