「プログラマ脳を鍛える数学パズル」補完計画:進数変換(2)
以下でC言語版を書いた。
それの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)