为什么std::bitset的比特位是反向排列的?

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

例如:std::string bin = "1011",但是bitset要求它按顺序为"1101" - user4344
2
bitset不会以“反向”的顺序存储位。然而,您的输入字符串确实是这样。 - Jeremy CD
2
bitset并不需要任何东西!它基本上只是一个数组,而to_ulong()仅仅计算bit[0]*2^0 + bit[1]*2^1 + bit[2]*2^2 + ...(其中^表示“乘方”)。 - Oliver Charlesworth
2个回答

34

Bitset以您认为的“反向”顺序存储其数字,因为尽管字符串的字符按递增索引顺序排列,我们将数字的数字按降序排列。

如果我们按小端顺序编写数字,那么您就不会产生这种混淆,因为您字符串中索引0的字符将表示bitset的位0。但是我们按大端顺序编写我们的数字。恐怕我不知道人类历史上导致这种传统的细节。(请注意,任何特定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();
}

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

编辑:格式和返回类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接