Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で16進数を8進数に変換するプログラムの書き方【サンプルコード付き】

文字列として与えられた16進数を、8進数へ変換するのがこのプログラムの目的です。16進数から8進数への直接変換は複雑なため、次の2段階の手順で行います。

  • 16進数を一度2進数に変換する
  • その2進数を8進数に変換する

16進数とは

16進数は基数が16の記数法です。0〜9の数字に加え、10以上の値はアルファベットで表され、A=10、B=11、C=12、D=13、E=14、F=15 に対応します。

16進数を2進数に変換するときは、各桁ごとに4ビットの2進数へ置き換え、それらを連結して1つの2進数を作ります。

8進数とは

8進数は基数が8の記数法で、0〜7の数字だけで表されます。コンピュータの内部では、2進数を右側から3ビットずつ区切ってまとめることで、8進数の1桁が得られます。

変換の流れを例で確認しよう

例として、16進数「1A6」を扱います。これは 1・A(=10)・6 という意味です。まず各桁を4ビットの2進数に置き換えます。

16進数の桁1A6
2進数(4ビット)000110100110

したがって、1A6 の2進数表現は「0001 1010 0110」となります。

次に、この2進数を右端から3ビットずつグループ化します。「000 110 100 110」となり、各グループを8進数に対応させます。

2進数(3ビット)000110100110
8進数の桁0646

よって、16進数「1A6」の8進数表現は「646」になります。

実行例

入力: 1A6
出力: Octal Value = 646

入力: 1AA
出力: Octal Value = 652

問題を解くためのアプローチ

  • 入力を受け取り、文字列として保存します。
  • 16進数を2進数へ変換します。
    • switch文で16通りすべてのケース(0〜9、a/A〜f/F)に対応する2進数の値を順に加算していきます。
    • 最終的な2進数の値を返します。
  • 2進数を8進数へ変換します。
    • 2進数を下3桁ずつ取り出し、対応する8進数の値を求めます。
    • octal = (val * place) + octal; で結果を組み立てます。
    • binary /= 1000 で処理済みの3桁を除きます。
    • place *= 10 で桁位置を1つ上に移動します。
  • 結果を返します。

アルゴリズム

Start
Step 1-> 関数 long long int hexa_binary(char hex[])
    binary と place を宣言
    i = 0、rem、val を宣言・初期化
    n = strlen(hex) を初期化
    binary = 0ll、place = 0ll を初期化
    i = 0 から hex[i] != '\0' の間ループ {
       binary = binary * place;
       hex[i] の値に応じて switch 文で対応する2進数を加算
       (0→0, 1→1, 2→10, ... , f/F→1111)
       該当しない場合は "Invalid hexadecimal input." を表示
       place = 10000;
    }
    binary を返す
関数 long long int binary_oct(long long binary)
    octal、place を宣言
    octal = 0ll、place = 1 を初期化
    binary > 0 の間ループ {
       rem = binary % 1000;
       rem の値に応じて val を設定 (0→0, 1→1, 10→2, ... , 111→7)
       octal = (val * place) + octal;
       binary /= 1000;
       place *= 10;
    }
    octal を返す
関数 long long int hexa_oct(char hex[])
    hexa_binary(hex) で16進数→2進数に変換
    binary_oct(binary) で2進数→8進数に変換
    octal を返す
main 関数
    hex[20] = "1a99" を用意し、hexa_oct(hex) の結果を表示
End

C言語による完全なサンプルコード

#include <stdio.h>
#include <string.h>
#include <math.h>
//To convert hex to binary first
long long int hexa_binary(char hex[]) {
    long long int binary, place;
    int i = 0, rem, val;
    int n = strlen(hex);
    binary = 0ll;
    place = 0ll;
    for (i = 0; hex[i] != '\0'; i++) {
        binary = binary * place;
        switch (hex[i]) {
        case '0':
            binary += 0;
            break;
        case '1':
            binary += 1;
            break;
        case '2':
            binary += 10;
            break;
        case '3':
            binary += 11;
            break;
        case '4':
            binary += 100;
            break;
        case '5':
            binary += 101;
            break;
        case '6':
            binary += 110;
            break;
        case '7':
            binary += 111;
            break;
        case '8':
            binary += 1000;
            break;
        case '9':
            binary += 1001;
            break;
        case 'a':
        case 'A':
            binary += 1010;
            break;
        case 'b':
        case 'B':
            binary += 1011;
            break;
        case 'c':
        case 'C':
            binary += 1100;
            break;
        case 'd':
        case 'D':
            binary += 1101;
            break;
        case 'e':
        case 'E':
            binary += 1110;
            break;
        case 'f':
        case 'F':
            binary += 1111;
            break;
        default:
            printf("Invalid hexadecimal input.");
        }
        place = 10000;
    }
    return binary;
}
//To convert binary to octal
long long int binary_oct(long long binary) {
    long long int octal, place;
    int i = 0, rem, val;
    octal = 0ll;
    place = 0ll;
    place = 1;
    // giving all binary numbers for octal conversion
    while (binary > 0) {
        rem = binary % 1000;
        switch (rem) {
        case 0:
            val = 0;
            break;
        case 1:
            val = 1;
            break;
        case 10:
            val = 2;
            break;
        case 11:
            val = 3;
            break;
        case 100:
            val = 4;
            break;
        case 101:
            val = 5;
            break;
        case 110:
            val = 6;
            break;
        case 111:
            val = 7;
            break;
        }
        octal = (val * place) + octal;
        binary /= 1000;
        place *= 10;
    }
    return octal;
}
// to convert the hexadecimal number to octal
long long int hexa_oct(char hex[]) {
    long long int octal, binary;
    // convert HexaDecimal to Binary
    binary = hexa_binary(hex);
    // convert Binary to Octal
    octal = binary_oct(binary);
    return octal;
}
//main function
int main() {
    char hex[20] = "5CD";
    printf("Octal Value = %lld", hexa_oct(hex));
    return 0;
}

出力結果

Octal Value = 2715

このプログラムでは、main関数内で16進数「5CD」を設定しています。5CD は2進数で「0101 1100 1101」と表され、これを3ビットずつ区切ると「010 111 001 101」、つまり8進数で「2715」になります。

まとめ

16進数から8進数への変換は、2進数を経由することでシンプルに実装できます。各16進数の桁を4ビットの2進数に展開し、その後3ビットずつ区切って8進数に再構成する流れを、switch文による対応表方式で実現している点がポイントです。大文字・小文字どちらの16進数入力にも対応しており、不正な文字が入力された場合にはエラーメッセージを表示する設計になっています。

  1. Pythonで10進数を2進数に変換する方法|再帰処理とbin()関数の実装例

    この記事では、「10進数を2進数に変換する」という問題に対する解決策を、具体的なコード例とともにわかりやすく解説します。 問題の概要 問題: 与えられた10進数の整数を、それに対応する2進数表現へ変換する。 この問題を解くには、大きく分けて2つのアプローチがあります。順番に見ていきましょう。 方法1:再帰を使った実装 10進数を2進数に変換する基本的な考え方は、「数値を2で割り続け、その余りを記録する」ことです。再帰関数を使うと、除算を繰り返しながら余りを自動的に上位の桁から順に出力できます。 サンプルコード def DecimalToBinary(num): if num &g

  2. Pythonで10進数を2進数・8進数・16進数に変換する方法をわかりやすく解説

    Pythonには、10進数の整数を2進数・8進数・16進数に変換するための組み込み関数が標準で用意されています。それぞれ以下の関数を使用します。2進数: bin() 8進数: oct() 16進数: hex()これらの関数は、引数に整数を渡すだけで、対応する基数の文字列表現を文字列として返してくれます。非常にシンプルで直感的に使えるのが特徴です。基本的な使い方実際に、10進数の「27」をそれぞれの進数に変換してみましょう。decimal = 27 print(bin(decimal), in binary.) print(oct(decimal), in octal.) print(hex(