C++編で扱っている C++ は 2003年に登場した C++03
という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14
-> C++17 -> C++20 -> C++23 と更新されています。
なかでも 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
「VisualC++」という表現を「VisualStudio」に統一。
Xcode 8.3.3 を clang 5.0.0 に置き換え。
clang 3.7 (Xcode 7.3) を、Xcode 8.3.3 に置き換え。
VisualC++ 2017 に対応。
clang の対応バージョンを 3.7 に更新。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |