2011-02-11 68 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(); 
} 

編輯:格式和返回類型。