HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

「プログラマ脳を鍛える数学パズル」補完計画:進数変換(2)

以下でC言語版を書いた。

hhelibex.hatenablog.jp

それのC++版。せっかくなのでstringを使って書いてみた。

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

/*
 * 与えられた文字列を逆順にする。
 *
 * str 文字列が格納された配列
 */
string reverse(string src) {
    string dest(src.rbegin(), src.rend());
    return dest;
}

/*
 * 与えられた文字セットを使って、整数値の進数変換をして文字列にする。
 *
 * digits 使用する文字セット
 * src 変換元の整数値
 * dest 変換結果を格納する文字配列
 */
string dec(string digits, int src) {
    int base = digits.length();

    int i = 0;

    char buf[128];
    // 下位の桁から順にbufに格納する
    do {
        int r = src % base;
        buf[i++] = digits[r];
        src /= base;
    } while (src > 0);
    buf[i] = '\0';

    string dest(buf);
    // 上位が先頭になるように文字列を逆順にする
    dest = reverse(dest);
    return dest;
}

/*
 * 10進⇒2進変換
 */
string toBin(int src) {
    return dec("01", src);
}

/*
 * 10進⇒8進変換
 */
string toOct(int src) {
    return dec("01234567", src);
}

/*
 * 10進⇒16進変換
 */
string toHex(int src) {
    return dec("0123456789ABCDEF", src);
}

int main(int argc, char** argv) {
    string dBin;
    string dOct;
    string dHex;
    int sample[] = { 0, 1, 2, 5, 8, 123456789, 0x7fffffff };

    for (int i = 0; i < sizeof(sample) / sizeof(int); ++i) {
        dBin = toBin(sample[i]);
        dOct = toOct(sample[i]);
        dHex = toHex(sample[i]);
        cout << sample[i] << endl;
        cout << "  => " << dBin << "(2)" << endl;
        cout << "  => " << dOct << "(8)" << endl;
        cout << "  => " << dHex << "(16)" << endl;
    }
    return EXIT_SUCCESS;
}

実行結果。

0
  => 0(2)
  => 0(8)
  => 0(16)
1
  => 1(2)
  => 1(8)
  => 1(16)
2
  => 10(2)
  => 2(8)
  => 2(16)
5
  => 101(2)
  => 5(8)
  => 5(16)
8
  => 1000(2)
  => 10(8)
  => 8(16)
123456789
  => 111010110111100110100010101(2)
  => 726746425(8)
  => 75BCD15(16)
2147483647
  => 1111111111111111111111111111111(2)
  => 17777777777(8)
  => 7FFFFFFF(16)