【C++】2進数 8進数 16進数 出力フォーマット【cout/iostream】


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_BIT8bit
sizeof(int)4byte
sizeof(int) * CHAR_BIT32bit
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);
}

広告