【C言語】16進数と2進数の文字列を相互に変換する方法

はじめに、C言語で16進数と2進数の変換方法を紹介します。
16進数と2進数はコンピュータ内部でよく使われるため、プログラミングにおいても重要な概念です。本記事では、これらの変換方法を簡単な例題を交えて解説していきます。
16進数から2進数への変換するプログラム
16進数から2進数への変換を行うプログラムは、以下の手順で実装することができます。
- 16進数の文字列を入力する
- strtol関数を使って、16進数の文字列を10進数に変換する
- 10進数を2進数に変換し、結果を出力する
まず、16進数の文字列を入力します。この際、scanf関数などを用いてユーザーから値を受け取ることができます。
次に、strtol関数を使用して10進数に変換します。strtol関数はstdlib.h
ライブラリに含まれており、以下のような形式で使用します。
long int strtol(const char *nptr, char **endptr, int base);
第一引き渡しパラメータnptrは変換対象となる文字列です。
第二引き渡しパラメータendptrは処理された最後の位置が格納されます。16進数を10進数に変換するだけならNULLで問題ありません。
第三引き渡しパラメータbaseは基底(何桁か)です。今回は16桁(つまり16進法)なので、「base=16」と指定します。
例えば、「0x1F」という16進数の文字列があった場合、
char* str = "0x1F";
long decimal = strtol(str, NULL, 16);
と書くことで「31」(10進法)がdecimalに代入されます。
最後に得られた10進法表現(decimal) を2ビット表現(binary) へ変換します。
#include <stdio.h>
#include <stdlib.h>
int main() {
char* str = "0x1F";
long decimal = strtol(str, NULL, 16);
int binary[32];
int i = 0;
//0になるまで2で割り続け、値を格納する
while(decimal > 0) {
binary[i] = decimal % 2;
decimal /= 2;
i++;
}
printf("2進数表現:");
for(int j = i - 1; j >= 0; j--) {
printf("%d", binary[j]);
}
printf("\n");
return 0;
}
2進数表現:11111
binary配列には、0と1が格納されており、桁が大きい順に取得して2進数化した0x1F
を出力しています。
2進数から16進数への変換するプログラム
2進数から16進数への変換を行うプログラムについて説明します。
まず、2進数の文字列を10進数に変換する場合も、strtol()
関数を使用します。
char* binary = "10101011";
long decimal = strtol(str, NULL, 2);
次に、10進数から16進数への変換を行うために、sscanf()
関数を使用します。
この関数は、第1引数で指定した文字列からフォーマット文字列(”%d”など)に従ってデータを読み取りますが、「%x」というフォーマット指定子を使用することで、10進数の数値を16進数に変換することが可能です。
以下はサンプルコードです。
#include <stdio.h>
#include <stdlib.h>
int main() {
char binary[] = "10101011"; // 2進表現された文字列
long decimal = strtol(binary, NULL, 2); // 2 -> 10 変換
char hex[20]; // 結果格納用バッファ
// x を X にすると16進数のアルファベットが大文字になります
sprintf(hex, "%x", (unsigned int)decimal); // 10 -> 16 変換
printf("2進表記: %s\n10進表記: %ld\n16進表記: %s\n", binary, decimal, hex);
return 0;
}
2進表記: 10101011
10進表記: 171
16進表記: ab
上記コードでは、「10101011」という2進表現された文字列が与えられており、それを「ab」という16進表現された文字列に変換しています。
まとめ
本記事では、C言語を使って16進数から2進数への変換と、2進数から16進数への変換について解説しました。
まず、16進数から2進数への変換については、以下の手順で行います。
- 16進数の文字列をstrtol関数で10進数の数値に変換する
- 10進数の数値を剰余算を用いて2進数に変換する
次に、2進数から16進数への変換については、以下の手順で行います。
- 2進数の文字列をstrtol関数で10進法の数値に変換する
- 10進数の数値をsscanf関数で16進数の文字列に変更する
これら二つが出来るようになれば十分です。