数値を 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 演算でメモリ確保されていますが、その管理はスマートポインタに任せてあるので、呼び出し側でそれを明示的に解放する必要はありません。


[ もどる ]