2進数・8進数・10進数・16進数
iostream(cout, stringstream)向けに専用のマニピュレータが用意されています。2進数の場合はbitset
クラス(#include <bitset>
)を介して出力・表示する必要があります。
16進数 | std::hex |
10進数 | std::dec |
8進数 | std::oct |
2進数 | std::bitset<ビット幅>(値) |
std::cout << std::hex << 16; // 10 (16進数)
std::cout << std::dec << 9; // 9 (10進数)
std::cout << std::oct << 9; // 11 ( 8進数)
std::cout << std::bitset<8>(9); // 00001001 (2進数)
スポンサーリンク
showbaseマニピュレータ
std::showbase
マニピュレータを用いると、数字の先頭に基数を表す記号(0x
, 0
)が付与されます。ただし2進数・10進数には対応していません。
std::cout << std::showbase;
std::cout << std::hex << 16; // 0x10 (16進数)
std::cout << std::dec << 9; // 9 (10進数)
std::cout << std::oct << 9; // 011 ( 8進数)
std::cout << std::bitset<8>(9); // 00001001 (2進数)
std::cout << std::noshowbase; /* 解除 */
bitsetクラスでの注意
bitsetクラスはビット幅の指定が必須で、また出力する値に適したビット幅が求められます。
std::cout << std::bitset<4>(16); // 0000
std::cout << std::bitset<8>(16); // 00010000
sizeof(値 or 型名) * CHAR_BIT
式を用いれば、型に適したビット幅を取得することが可能になりますので覚えておくと良いでしょう。
CHAR_BIT | 8bit |
sizeof(int) | 4byte |
sizeof(int) * CHAR_BIT | 32bit |
size_t is = CHAR_BIT * sizeof(int); // 32
size_t ls = CHAR_BIT * sizeof(long); // 64
size_t ss = CHAR_BIT * sizeof(ss); // 64
// 2147483647 (0b01111111111111111111111111111111)
int v = INT_MAX;
// 11111111 (8bit)
std::cout << std::bitset<8>(v) << std::endl;
// 01111111111111111111111111111111 (32bit)
std::cout << std::bitset<32>(v) << std::endl;
// 01111111111111111111111111111111 (32bit)
std::cout << std::bitset<sizeof(v) * CHAR_BIT>(v) << std::endl;
printb関数の自作
一足早いクリスマスプレゼントです。
#include <bitset>
template<class T> void printb(T v) {
std::cout << std::bitset<sizeof(v) * CHAR_BIT>(v);
}
template<class T> void putb(T v) {
std::cout << "0b"; printb(v); std::cout << std::endl;
}
putb(9); // 0b00000000000000000000000000001001
putb(static_cast<char>(9)); // 0b00001001
putb(9UL); // 0b0000000000000000000000000000000000000000000000000000000000001001
bitsetを使わない場合。
template<class T> void printb(T v) {
typedef typename std::make_unsigned<T>::type U;
U mask = static_cast<U>(1) << (sizeof(U) * CHAR_BIT - 1);
do std::cout << (mask & v ? '1' : '0'); while (mask >>= 1);
}