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