Bitset は、文字列の文字がインデックスの昇順で配置されている場合でも、数値の桁を重要度の降順で書き込むため、「逆」と見なされる順序で数値を格納します。
数値をリトル エンディアン順で記述した場合、文字列のインデックス 0 の文字がビットセットのビット 0 を表すため、この混乱はありません。ただし、数字はビッグエンディアン順に書きます。残念ながら、その条約につながった人類の歴史の詳細はわかりません。(また、特定の CPU がマルチバイト数を格納するために使用するエンディアンは無関係であることに注意してください。人間が読み取れるように数値を表示するときに使用するエンディアンについて話しているのです。)
たとえば、10 進数の 12 を 2 進数で書くと、1100 になります。最下位ビットは右側にあります。これを「ビット 0」と呼びます。しかし、それを文字列に入れると、その"1100"
文字列のインデックス 0 の文字は、ビット 0 ではなくビット 3 を表します。文字と同じ順序でビットを含むビットセットを作成すると、to_ulong
12 ではなく 3 が返されます。
ビットセット クラスには を受け入れるコンストラクターがstd::string
ありますが、文字のインデックスがビットのインデックスと一致することが想定されているため、文字列を逆にする必要があります。これを試して:
int binary_to_dec(std::string const& bin)
{
std::bitset<8> bit(std::string(bin.rbegin(), bin.rend()));
return bit.to_ulong();
}