为什么std :: bitset的位按相反的顺序排列?

use*_*344 13 c++ bitset

为什么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();
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*edy 30

Bitset将其数字存储在您认为是"反向"的顺序中,因为即使字符串的字符按递增的索引顺序排列,我们也会按重要性的降序编写数字的数字.

如果我们以little-endian顺序编写我们的数字,那么你就不会有这种混淆,因为你的字符串索引0处的字符代表bitset的第0位.但是我们用big-endian顺序写下我们的数字.我害怕我不知道导致这一惯例的人类历史的细节.(请注意,任何特定CPU用于存储多字节数字的字节顺序都是无关紧要的.我在谈论我们在显示人类阅读数字时使用的字节序.)

例如,如果我们以二进制形式写入十进制数12,则得到1100.最低有效位在右侧.我们称之为"第0位".但是,如果我们把在一个字符串,"1100"字符在该字符串的索引0表示第3位,而不是位0.如果我们创建了在相同的顺序字符位的位集合,to_ulong将返回3而不是12.

bitset类有一个接受a的构造函数std::string,但它期望字符的索引与该位的索引匹配,因此您需要反转该字符串.试试这个:

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