C++ 为什么std::bitset的位顺序相反?

C++ 为什么std::bitset的位顺序相反?,c++,bitset,C++,Bitset,为什么bitset以相反的顺序存储位?经过多次努力,我终于写出了这个二进制文件。它能简化吗 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));

为什么bitset以相反的顺序存储位?经过多次努力,我终于写出了这个二进制文件。它能简化吗

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();
}
int binary到dec(std::string bin)
{
std::位集位;
int c=bin.size();
对于(size_t i=0;i<>代码> 

位集将它的数字存储在你认为是“反向”的顺序中,因为我们把一个数字的数字写在有意义的递减顺序中,即使字符串的字符按递增的索引顺序排列。

如果我们以小尾端顺序写数字,那么就不会有这种混淆,因为字符串索引0处的字符将表示位集的位0。但我们是按大端顺序写数字的。恐怕我不知道导致那次大会的人类历史的细节。(请注意,任何特定CPU用于存储多字节数字的endianness都是无关的。我指的是我们在显示数字供人阅读时使用的endianness。)

例如,如果我们用二进制写十进制数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();
}
int binary到dec(std::string const&bin)
{
std::位集位(std::字符串(bin.rbegin(),bin.rend());
将位返回到_ulong();
}
无符号长二进制文件(std::string bin)
{
std::位集位(bin);
将位返回到_ulong();
}

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

例如:
std::string bin=“1011”
但位集要求它按顺序排列
“1101”
位集不按“相反”顺序存储位。但是,您的输入字符串确实需要。
位集
不“需要”任何东西!它基本上只是一个数组,
to_ulong()
只计算
位[0]*2^0+位[1]*2^1+位[2]*2^2+…”(其中
^`表示“的幂”)。相关:
unsigned long binary_to_dec(std::string bin)
{
    std::bitset<sizeof(unsigned long)*8> bits(bin);
    return bits.to_ulong();
}