C++ 数値を 2進数 8進数 10進数 16進数 文字列に変換する方法

C++で数値を16進数や8進数のstd::string型文字列に変換したい場合には、std::stringstreamクラスと各種マニピュレータを活用します。

16進数への変換にはstd::hexマニピュレータ、8進数への変換にはstd::octマニピュレータを用います。2進数の場合はstd::bitsetクラスを介する必要があります。

16進数への文字列変換(std::hex)

// #include <sstream> // std::stringstream
std::stringstream ss;
ss << std::hex << 16;
std::string s = ss.str(); // "10"

10進数への文字列変換(std::dec)

// #include <sstream> // std::stringstream
std::stringstream ss;
ss << std::dec << 99;
std::string s = ss.str(); // "99"

純粋に数値を文字列に変換したいのであれば、std::to_string関数を用いる方法もあります。

参考:数値型を文字列型に変換する方法(to_string, stringstream)

8進数への文字列変換(std::oct)

// #include <sstream> // std::stringstream
std::stringstream ss;
ss << std::oct << 9;
std::string s = ss.str(); // "11"

2進数への文字列変換(std::bitset)

// #include <sstream> // std::stringstream
// #include <bitset>  // std::bitset<N>
std::stringstream ss;
ss << std::bitset<8>(9);
std::string s = ss.str(); // "00001001"

bitsetクラスの非型テンプレート引数にはビット幅を指定します。出力する数値の型やサイズに応じて、十分な長さを指定する必要があるため注意が必要です。

参考:bitsetクラスの幅を適切に指定する方法

n進数の基数を表す記号を表記する

数字の先頭に基数を表す記号(0x, 0)を付与させたい場合にはstd::showbaseマニピュレータを用います。

std::stringstream ss;
ss << std::showbase;
ss << std::hex << 16;
std::string s = ss.str(); // "0x10"

16進数と8進数の表記にのみ対応しています。

参考:showbaseマニピュレータとn進数表記

2進数を表す記号を表記したい場合には、0b等の記号を自前で連結する必要があります。

std::stringstream ss;
ss << "0b" << std::bitset<8>(9);
std::string s = ss.str(); // "0b00001001"
広告