先頭へ戻る

bitset 解答ページ | Programming Place Plus C++編【標準ライブラリ】 第13章

Programming Place Plus トップページC++編

先頭へ戻る

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 と更新されており、今後も 3年ごとに更新されます。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。

問題①

問題① bitset を利用して、整数値を、2進数を文字列で表現したものに変換する関数を作成してください。


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

const std::string ToBinStr(unsigned long value)
{
    return std::bitset<64>(value).to_string<char, std::char_traits<char>, std::allocator<char> >();
}

int main()
{
    std::cout << ToBinStr(100) << std::endl;
    std::cout << ToBinStr(5000) << std::endl;
    std::cout << ToBinStr(0) << std::endl;
    std::cout << ToBinStr(~0) << std::endl;
}

実行結果

0000000000000000000000000000000000000000000000000000000001100100
0000000000000000000000000000000000000000000000000001001110001000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000011111111111111111111111111111111

bitset のコンストラクタは、unsigned long型の整数値を受け取れます。また、to_stringメンバ関数を使えば、文字列化したビット列が返されるので、これで2進数の文字列表現を得られます。

bitset のビット総数を 64 で固定していますが、移植性を考えると、unsigned long型が表現できる大きさに応じて、変更する必要があります。

第15章で説明する、std::numeric_limits を使えば改善できます。std::bitset<std::numeric_limits<unsigned long>::digits> とします。

なお、上位に 0 が並ぶのが嫌なら、string の findメンバ関数(第2章)を利用するなどして加工すると良いでしょう。

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

const std::string ToBinStr(unsigned long value)
{
    const std::string s = std::bitset<64>(value).to_string<char, std::char_traits<char>, std::allocator<char> >();
    const std::string::size_type index = s.find("1");  // 一番上位の 1 を探す
    if (index != std::string::npos) {
        return s.substr(index);  // '1' が見つかったら、それ以降の部分文字列を返す
    }
    return "0";  // '1' が見つからない場合は 0
}

int main()
{
    std::cout << ToBinStr(100) << std::endl;
    std::cout << ToBinStr(5000) << std::endl;
    std::cout << ToBinStr(0) << std::endl;
    std::cout << ToBinStr(~0) << std::endl;
}

実行結果

1100100
1001110001000
0
11111111111111111111111111111111


参考リンク


更新履歴

’2018/4/2 「VisualC++」という表現を「VisualStudio」に統一。

’2018/1/5 Xcode 8.3.3 を clang 5.0.0 に置き換え。

’2017/7/30 clang 3.7 (Xcode 7.3) を、Xcode 8.3.3 に置き換え。

’2017/3/25 VisualC++ 2017 に対応。

’2016/10/15 clang の対応バージョンを 3.7 に更新。

’2015/10/31 新規作成。



第13章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー