C++で数値を16進数や8進数のstd::string
型文字列に変換したい場合には、std::stringstream
クラスと各種マニピュレータを活用します。
16進数への変換にはstd::hex
マニピュレータ、8進数への変換にはstd::oct
マニピュレータを用います。2進数の場合はstd::bitset
クラスを介する必要があります。
- 16進数への文字列変換(std::hex)
- 10進数への文字列変換(std::dec)
- 8進数への文字列変換(std::oct)
- 2進数への文字列変換(std::bitset)
- n進数の基数を表す記号を表記する(
0x
,0
など)
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"