2011-02-11 146 views
11

bitset为什么bitset以相反的顺序存储?经过多次努力,我终于写下了这个binary_to_dec。它可以简化吗?为什么std :: 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(); 
} 
+0

例如:`的std :: string仓=“1011”`但位集要求它为了`“1101”` – user4344 2011-02-11 23:24:47

回答

30

位集合存储其数量在你认为什么是“逆向”命令,因为我们写一个数字的位数递减秩序意义的,即使一个字符串的字符排列在增加指数订购。

如果我们在little-endian顺序写我们的数字,那么你就不会有这样的困惑,因为在你的字符串的索引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(); 
} 

编辑:格式和返回类型。

相关问题