数値を 2 進数で表現された文字列に変換する - C++ プログラミング
PROGRAM
数値を 2 進数で表現された文字列に変換する
C++ で数値を 2 進数表記で表示させようと思ったのですが、簡単に変換する方法が見つけられませんでした。
8 進数や 16 進数であれば std::ostringstream と std::cout で出力する書式を指定する で記した std:ios::oct や std::ios::hex といった std::ios::basefield マニピュレータを使って文字列に変換できるのですけど、2 進数用のマニピュレータは用意されていないようです。
Visual C++ なら _itoa 関数を使って 2 進文字列に変換することもできそうですけど、Xcode 4.6.2 ではこれは使えないようです。
そこで、数値型の引数を受け取って、それを 2 進文字列に変換した C 文字列を返す テンプレート関数 "stringInBinary<>" を作成してみることにしました。
戻り値は char* を新たに生成したのを返すのですが、メモリ管理を簡単にするために スマートポインタ を使ってみます。
数値を 2 進文字列に変換する関数を作成する
今回の変換関数では、次のヘッダーをインクルードする必要があります。
#include <climits>
#include <memory>
そして、数値を 2 進文字列に変換する関数 "stringInBinary<>" は次のように実装してみます。
template <class T>
std::unique_ptr<char[]> stringInBinary(T value)
{
// 扱うデータ型のビット数を計算して、そのビット数と NUL 文字を格納できる文字列バッファを生成します。
size_t bits = sizeof(T) * CHAR_BIT;
auto string = std::unique_ptr<char[]>(new char[bits + 1]);
// 文字列バッファを後ろから順に詰めて行きます。
char* p = (string.get() + bits);
// 末端のビットから順に取得するためのマスクです。
T mask = 1;
// 文字列バッファの最後尾に NUL を設定します。
*p = '\0';
// 全てのビットを文字列化するまで繰り返します。
do
{
// 文字列バッファの書き込み位置をひとつ前に移動して、当該ビットを文字列にして設定します。
// このとき、値を目的のビット (mask) でマスクした時に値が残れば '1'、残らなければ '0' です。
*(--p) = ((value & mask) != 0 ? '1' : '0');
// ビットマスクを次のビット(左)に移動します。
mask = (mask << 1);
}
while (--bits);
// 全てのビットを処理したら、文字列バッファを返して終了です。
return string;
}
これで、引数に指定された値をそのデータ型が表現できるビット桁数で 2 進文字列化する、テンプレート関数ができました。
戻り値は std::unique_ptr<char[]> 型のスマートポインタで返すので、取得した文字列を使用する場合には、次のように get 関数を使って char* 型のポインターを取得して使います。
std::unique_ptr<char[]> string = stringInBinary(value);
// get 関数を使って char* ポインタを取り出せます。
std::cout << string.get() << std::endl;
戻り値として返された文字列バッファは、2 進文字列を生成する stringInBinary 関数内で new 演算でメモリ確保されていますが、その管理はスマートポインタに任せてあるので、呼び出し側でそれを明示的に解放する必要はありません。
[ もどる ]