数値システム間の変換

CCBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

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

  • 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

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c/ControlFlowGroup -.-> c/if_else("If...Else") c/ControlFlowGroup -.-> c/for_loop("For Loop") c/ControlFlowGroup -.-> c/while_loop("While Loop") c/FunctionsGroup -.-> c/function_declaration("Function Declaration") c/FunctionsGroup -.-> c/function_parameters("Function Parameters") c/FunctionsGroup -.-> c/math_functions("Math Functions") c/FunctionsGroup -.-> c/recursion("Recursion") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/if_else -.-> lab-123228{{"数値システム間の変換"}} c/for_loop -.-> lab-123228{{"数値システム間の変換"}} c/while_loop -.-> lab-123228{{"数値システム間の変換"}} c/function_declaration -.-> lab-123228{{"数値システム間の変換"}} c/function_parameters -.-> lab-123228{{"数値システム間の変換"}} c/math_functions -.-> lab-123228{{"数値システム間の変換"}} c/recursion -.-> lab-123228{{"数値システム間の変換"}} c/user_input -.-> lab-123228{{"数値システム間の変換"}} c/output -.-> lab-123228{{"数値システム間の変換"}} end

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言語プログラミングにおいて異なる数値システム間で数値を変換する方法を理解するのに役立ったことを願っています。