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 以您认为“反向”的顺序存储它的数字,因为即使字符串的字符以递增的索引顺序排列,我们也会按照重要性的递减顺序写入数字的数字。

如果我们以 little-endian 顺序编写我们的数字,那么您将不会有这种混淆,因为字符串索引 0 处的字符将代表 bitset 的位 0。但是我们以大端顺序编写我们的数字。恐怕我不知道导致该公约的人类历史细节。(请注意,任何特定 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();
}
于 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 回答