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

C++で任意の基数から10進数へ、またはその逆に変換する方法


このチュートリアルでは、C++を使って任意の基数の数値を10進数に変換する方法と、その逆である10進数から任意の基数への変換を行うプログラムについて解説します。

ここでは、整数とその基数が与えられた際に、その数値を10進数表現へ変換する処理を実装します。さらに、逆の手順として、10進数の数値を指定した基数の表現に変換する方法もあわせて紹介します。

任意の基数から10進数への変換

この変換では、各桁の文字に対応する数値を求め、桁の位置に応じた基数の冪乗を掛け合わせてすべて合計します。文字列の末尾(最下位の桁)から順に処理することで、冪乗を効率的に更新しながら計算を進められます。

サンプルコード

#include <stdio.h>
#include <string.h>

// 各文字に対応する数値を返す
int val(char c) {
    if (c >= '0' && c <= '9')
        return (int)c - '0';
    else
        return (int)c - 'A' + 10;
}

// 数値を10進数表現に変換する
int convert_decimal(char *str, int base) {
    int len = strlen(str);
    int power = 1;
    int num = 0;
    int i;
    for (i = len - 1; i >= 0; i--) {
        if (val(str[i]) >= base) {
            printf("Invalid Number");
            return -1;
        }
        num += val(str[i]) * power;
        power = power * base;
    }
    return num;
}

int main() {
    char str[] = "11A";
    int base = 16;
    printf("Decimal equivalent of %s in base %d is " " %d\n", str, base, convert_decimal(str, base));
    return 0;
}

実行結果

Decimal equivalent of 11A in base 16 is 282

この例では、16進数の「11A」を10進数に変換しています。計算の内訳は以下の通りです。

  • A(=10)× 16⁰ = 10
  • 1 × 16¹ = 16
  • 1 × 16² = 256
  • 合計:256 + 16 + 10 = 282

10進数から任意の基数への変換

次に、逆の操作を行います。10進数の数値を指定した基数で繰り返し割り、その都度発生する余りを下位の桁から順に記録していきます。除算が終わった後に文字列を反転させれば、正しい桁順の結果が得られます。

サンプルコード

#include <stdio.h>
#include <string.h>

// 数値に対応する文字を返す
char reVal(int num) {
    if (num >= 0 && num <= 9)
        return (char)(num + '0');
    else
        return (char)(num - 10 + 'A');
}

// 文字列を反転させる
void reverse_string(char *str) {
    int len = strlen(str);
    int i;
    for (i = 0; i < len / 2; i++) {
        char temp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = temp;
    }
}

// 10進数を基数「base」の表現に変換する
char* convert_base(char res[], int base, int inputNum) {
    int index = 0;
    while (inputNum > 0) {
        res[index++] = reVal(inputNum % base);
        inputNum /= base;
    }
    res[index] = '\0';
    // 結果を反転させて正しい桁順に整える
    reverse_string(res);
    return res;
}

int main() {
    int inputNum = 282, base = 16;
    char res[100];
    printf("Equivalent of %d in base %d is "" %s\n", inputNum, base, convert_base(res, base, inputNum));
    return 0;
}

実行結果

Equivalent of 282 in base 16 is 11A

この例では、先ほどの逆変換として、10進数の「282」を16進数に変換し、「11A」という結果が得られることを確認できます。

なお、本記事のコードはC言語風のスタイルで記述されていますが、C++でもそのままコンパイル・実行できます。

  1. スマホとパソコン間で動画を転送する方法5選【Android・PC対応】

    「スマホを初期化したいのですが、大切な動画が消えてしまうのが心配です。AndroidからPCへ動画をバックアップとして転送する最良の方法は何ですか?」 大切なデータを守りたいのは誰でも同じこと。長年保管してきた動画が失われるのは、本当に辛い経験ですよね。スマホの容量が不足してきたときや、端末を初期化したいときなど、スマホからパソコンへ(またはその逆に)動画を移す必要が生じる場面は意外と多くあります。 幸いなことに、パソコンからスマホへ動画を転送する方法(およびその逆)は複数存在します。専用アプリを使う方法、USBケーブルで接続する方法、無線接続を活用する方法など、選択肢は豊富です。この記事では

  2. GoogleドキュメントをMicrosoft Word(.docx)に変換する方法【逆パターンも解説】

    Googleドキュメントは、アクセスや共有、文書への署名が手軽に行えることから、多くのユーザーに愛用されているサービスです。しかし、オフラインでの利用や他ツールとの互換性を考えると、DOCXといった定番フォーマットが必要になる場面もあります。Googleドキュメントに保存したファイルのオフラインコピーが必要な場合は、Microsoft Word形式への変換がとても簡単に行えます。本記事ではその逆の手順、つまりWord文書(.docx)をGoogleドキュメント形式に変換して開く方法についても併せてご紹介します。注意:GoogleドキュメントからWordへの変換は可能ですが、変換時に元の書式が完