整数値から 2進数への変換

printf 系関数を使っても、標準ストリームのマニピュレータを使っても、8進数、10進数、16進数に変換することはできても、2進数に変換することはできません。しかし、std::biset クラステンプレートを使えば簡単に変換することができます。

#include <iostream>
#include <bitset>

int main()
{
  unsigned long value = 1234;
  std::cout << std::bitset<32>(value) << std::endl;
  return 0;
}

上記のサンプルでは標準出力に直接出力していますが、変換結果を文字列として欲しいのであれば、次のようにすることができます。

#include <iostream>
#include <bitset>
#include <string>

int main()
{
  unsigned long value = 1234;
  std::string str(std::bitset<32>(value).to_string<char, std::char_traits<char>, std::allocator<char> >());
  return 0;
}

ただし、上のサンプルを見ても分かるように、to_string メンバ関数を呼び出すときはテンプレート実引数を指定しなければならず、かなり面倒です。そのため、あらかじめ次のような関数を作っておくと便利です。

#include <iostream>
#include <bitset>
#include <string>
 
template <std::size_t N>
std::string to_string(const std::bitset<N>& bs)
{
  return bs.to_string<char, std::char_traits<char>, std::allocator<char> >();
}
 
int main()
{
  unsigned long value = 1234;
  std::string str(to_string(std::bitset<32>(value)));
  return 0;
}

さらに、std::wstring 等も使えるようにするのであれば、次のようにしてもよいでしょう。

#include <bitset>
#include <string>
 
template <std::size_t N, class C, class Traits, class Allocator>
std::basic_string<C, Traits, Allocator>&
  to_string(const std::bitset<N>& bs, std::basic_string<C, Traits, Allocator>& str)
{
  str = bs.to_string<char, std::char_traits<char>, std::allocator<char> >();
  return str;
}
このエントリーを含むはてなブックマーク