14

bitset がビットを逆順に格納するのはなぜですか? 何度も苦労した後、ようやくこの binary_to_dec を書きました。単純化できますか?

int binary_to_dec(std::string bin)
{
    std::bitset<8> bit;

    int c = bin.size();

    for (size_t i = 0; i < bin.size(); i++,c--)
    {
        bit.set(c-1, (bin[i]-'0' ? true : false));
    }

    return bit.to_ulong();
}
4

2 に答える 2

34

Bitset は、文字列の文字がインデックスの昇順配置されている場合でも、数値の桁を重要度の降順で書き込むため、「逆」と見なされる順序で数値を格納します。

数値をリトル エンディアン順で記述した場合、文字列のインデックス 0 の文字がビットセットのビット 0 を表すため、この混乱はありません。ただし、数字はビッグエンディアン順に書きます。残念ながら、その条約につながった人類の歴史の詳細はわかりません。(また、特定の CPU がマルチバイト数を格納するために使用するエンディアンは無関係であることに注意してください。人間が読み取れるように数値を表示するときに使用するエンディアンについて話しているのです。)

たとえば、10 進数の 12 を 2 進数で書くと、1100 になります。最下位ビットは右側にあります。これを「ビット 0」と呼びます。しかし、それを文字列に入れると、その"1100"文字のインデックス 0 の文字は、ビット 0 ではなくビット 3 を表します。文字と同じ順序でビットを含むビットセットを作成すると、to_ulong12 ではなく 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();
}
于 2011-02-11T23:31:58.693 に答える
2
unsigned long binary_to_dec(std::string bin)
{
    std::bitset<sizeof(unsigned long)*8> bits(bin);
    return bits.to_ulong();
}

編集: 書式設定と戻り値の型。

于 2011-02-11T23:33:02.810 に答える