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

はじめに、C言語で16進数と2進数の変換方法を紹介します。

16進数と2進数はコンピュータ内部でよく使われるため、プログラミングにおいても重要な概念です。本記事では、これらの変換方法を簡単な例題を交えて解説していきます。

目次

16進数から2進数への変換するプログラム

16進数から2進数への変換を行うプログラムは、以下の手順で実装することができます。

  1. 16進数の文字列を入力する
  2. strtol関数を使って、16進数の文字列を10進数に変換する
  3. 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進数への変換については、以下の手順で行います。

  1. 16進数の文字列をstrtol関数で10進数の数値に変換する
  2. 10進数の数値を剰余算を用いて2進数に変換する

次に、2進数から16進数への変換については、以下の手順で行います。

  1. 2進数の文字列をstrtol関数で10進法の数値に変換する
  2. 10進数の数値をsscanf関数で16進数の文字列に変更する

これら二つが出来るようになれば十分です。

目次