std::bitset のビットが逆の順序になっているのはなぜですか?[重複]

StackOverflow https://stackoverflow.com/questions/4975037

  •  12-11-2019
  •  | 
  •  

質問

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();
}
役に立ちましたか?

解決

Bitset は数値の桁を「逆」の順序で書き込むため、数値を「逆」の順序で保存します。 減少する 文字列の文字が次のように配置されている場合でも、重要度の順序 増加する インデックスの順序。

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

たとえば、10 進数の 12 を 2 進数で書くと、1100 になります。最下位ビットは右側にあります。私たちはそれを「ビット0」と呼びますしかし、それを文字列に入れれば、 "1100", 、 キャラクター その文字列のインデックス 0 は、ビット 0 ではなくビット 3 を表します。文字と同じ順序でビットを含むビットセットを作成すると、 to_ulong 12 ではなく 3 を返します。

bitset クラスには、 std::string, ただし、文字のインデックスがビットのインデックスと一致することが期待されるため、文字列を反転する必要があります。これを試して:

int binary_to_dec(std::string const& bin)
{
  std::bitset<8> bit(std::string(bin.rbegin(), bin.rend()));
  return bit.to_ulong();
}

他のヒント

unsigned long binary_to_dec(std::string bin)
{
    std::bitset<sizeof(unsigned long)*8> bits(bin);
    return bits.to_ulong();
}

編集:フォーマットと戻り値の型。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top