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

时间:2011-02-11 23:19:55

标签: 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();
}

2 个答案:

答案 0 :(得分:30)

Bitset将其数字存储在您认为是“反向”顺序的数字中,因为即使字符串的字符排列在中,我们也会以递减重要性顺序写出数字的数字增加索引顺序。

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

例如,如果我们用二进制写十进制数12,我们得到1100.最低有效位在右边。我们称之为“第0位”。但是如果我们把它放在一个字符串"1100"中,那个字符串索引0处的字符表示第3位,而不是第0位。如果我们用相同的顺序创建了一个位集作为字符,to_ulong将返回3而不是12。

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();
}

答案 1 :(得分:2)

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

编辑:格式化和返回类型。

相关问题