为什么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();
}
答案 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();
}
编辑:格式化和返回类型。