数値システム間の変換

CBeginner
オンラインで実践に進む

はじめに

数値システムは、異なる記号と数学演算を使って数値を表現する方法です。異なる数値システム間の変換は、プログラミングにおいて一般的なタスクです。この実験では、数値をあるシステムから別のシステムに変換できるプログラムを紹介します。以下の内容を扱います。

  • 2 進数から 10 進数への変換
  • 8 進数から 10 進数への変換
  • 10 進数から 2 進数への変換(再帰なし)
  • 10 進数から 2 進数への変換(再帰あり)

注:コーディングを練習し、gcc を使ってコンパイルと実行方法を学ぶには、自分で ~/project/main.c ファイルを作成する必要があります。

cd ~/project
## main.cを作成する
touch main.c
## main.cをコンパイルする
gcc main.c -o main
## mainを実行する
./main

2 進数から 10 進数への変換

2 進数は、0 と 1 の 2 桁のみを使う数値システムです。10 進数は、0 から 9 までの 10 桁を使う数値システムです。以下は、2 進数をその 10 進数に変換する C プログラムです。

#include<stdio.h>
#include<math.h>

// 関数プロトタイプ宣言
int binary_decimal(int n);

int main()
{
    printf("\n\n\t\tLabEx - Best place to learn\n\n\n");
    int n;
    char c;
    printf("Enter the binary number: ");
    scanf("%d", &n);
    printf("\n\n\nThe decimal equivalent of %d is  %d\n\n", n, binary_decimal(n)); // 関数呼び出し
    printf("\n\n\t\t\tCoding is Fun!\n\n\n");
    return 0;
}

// 2 進数を 10 進数に変換する関数の定義
int binary_decimal(int n)
{
    int decimal = 0, i = 0, rem;
    while(n!= 0)
    {
        rem = n%10;   // 1 の位の桁を取得する
        n = n/10; // 1 の位の桁を除いた数を取得する
        /*
            pow は、2 つの整数を入力パラメータとして取る
            システム定義関数です
        */
        decimal += rem*pow(2, i++);
    }
    /*
        入力された 2 進数の 10 進数を
        関数呼び出しに返します
    */
    return decimal;
}

8 進数から 10 進数への変換

8 進数は、0 から 7 までの 8 桁を使う数値システムです。以下は、8 進数をその 10 進数に変換する C プログラムです。

#include<stdio.h>
#include<math.h>

int main()
{
    printf("\n\n\t\tLabEx - Best place to learn\n\n\n");
    long int octal, val, decimal = 0;
    int i = 0;
    printf("Enter any octal number: ");
    scanf("%ld", &val);
    octal = val;
    while(octal!= 0)
    {
        /*
            i++ は事後インクリメントで、値が
            最初に代入されてからインクリメントされます
        */
      decimal += (octal % 10)*pow(8, i++);
      octal/=10;    // octal=octal/10 と同じ
    }
    printf("\n\n\nEquivalent decimal value of %ld is %ld\n\n\n", val, decimal);
    printf("\n\n\t\t\tCoding is Fun!\n\n\n");
    return 0;
}

10 進数から 2 進数への変換(再帰なし)

以下は、再帰を使わずに 10 進数をその 2 進数に変換する C プログラムです。

#include<stdio.h>

int main()
{
    printf("\n\n\t\tLabEx - Best place to learn\n\n\n");
    int n,c,k;
    printf("Enter an integer in decimal number system: ");
    scanf("%d", &n);

    // 31 ビット形式で
    printf("\n\n\nThe binary equivalent of decimal value %d is:", n);

    for(c = 31; c >= 0; c--)
    {
        k = n>>c;
        /*
            num&1 = num の最後の桁が 1 の場合に true を返し、
            それ以外の場合は false を返します
        */
        if(k&1)
            printf("1");
        else
            printf("0");
    }
    printf("\n");
    printf("\n\n\t\t\tCoding is Fun!\n\n\n");
    return 0;
}

10 進数から 2 進数への変換(再帰を用いた)

以下は、再帰を使って 10 進数をその 2 進数に変換する C プログラムです。

#include<stdio.h>

//関数プロトタイプ宣言
void decimal_binary(int );
void F(int );
void reverse(int );

int main()
{
    printf("\n\n\t\tLabEx - Best place to learn\n\n\n");
    int n;
    printf("\n\nEnter an integer in decimal number system: ");
    scanf("%d", &n);

    //31 ビット形式で
    printf("\n\nThe binary equivalent of decimal value %d using decimal_binary method is: ", n);

    decimal_binary(n);  //関数呼び出し

    printf("\n\nThe binary equivalent of decimal value %d using F() method is: ", n);
    F(n);   //関数呼び出し
    printf("\n\nThe Reverse of the binary representation of value %d is: ", n);
    reverse(n); //関数呼び出し
    printf("\n\n\t\t\tCoding is Fun!\n\n\n");
    return 0;
}

//関数定義
void decimal_binary(int i)
{
    if(i <= 1)
    printf("%d", i);   //上から下の形式で表示するため
    else
    {
        decimal_binary(i/2);
        printf("%d", i%2);
    }
}

void F(int j)
{
    if(j/2)
    {
        F(j/2);
    }
    printf("%d", j%2);
}

void reverse(int k)
{
    if(k <= 1)
        printf("%d", k);
    else
    {
        printf("%d", k%2);
        F(k/2);
    }
    printf("\n\n");
}

まとめ

この実験では、異なる数値システム間で数値を変換できるプログラムを紹介しました。2 進数から 10 進数への変換、8 進数から 10 進数への変換、および 10 進数から 2 進数への変換(再帰ありとなし)を扱いました。この実験が、C 言語プログラミングにおいて異なる数値システム間で数値を変換する方法を理解するのに役立ったことを願っています。