2010-03-09 36 views
5

我有一個問題轉換的字符串二進制到十進制問題轉換字符串二進制(64位)爲十進制(C++中iphone)

我用位集

bitstring ="1011010001111111"; 

unsigned long binToDec(string bitstring){ 
    bitset<32> dec (bitstring); 
    return dec.to_ulong(); 
} 

所有這一切都正常工作,但!!問題來了,當我試圖做一個位字符串與更多的32位相同。我知道的bitset只做轉換4個字節,但我需要做轉換與具有48或56位字符串(有時我需要獲得14或15位)

string bitstring; 
bitstring ="11100101001001000000100000100100110100110011010001111111"; 
i want to get this number: 64497387062899840 

任何sugestion?任何人都有一個函數來將二進制字符串轉換爲十進制?

注:我不能使用提升,因爲它沒有移植到iphone。

感謝您的幫助

+0

分區字符串裝配到4個字節的每個部分,然後轉移-OR結果嗎? –

+0

題外話:C++/iphone ...你是如何獲得libuicaboodle工作或它叫什麼名字?或者它是純粹的命令行?如果是,我可以在哪裏下載圖書館?我沒有在任何地方發現它...祝賀 – Atmocreations

+0

尼古拉:我是如何做到這一點的? – ger123

回答

1

我剛剛放在一起,它似乎與你的例子一起工作,我還沒有測試任何更大的值,與計算器相比較的結果。

輸出:

64497387062899839 

代碼:

#include <iostream> 
#include <limits> 

using namespace std; 

unsigned long long convert(string& bits) 
{ 
    if (bits.length() > (size_t)numeric_limits<unsigned long long>::digits) 
     return 0; 

    unsigned long long sum = 0; 
    unsigned long long shift = 1; 
    for (string::reverse_iterator it(bits.rbegin()), end(bits.rend()); 
     it < end; ++it) 
    { 
     if (*it == '1') sum += shift; 
     shift = (shift << 1); 
    } 

    return sum; 
} 

int main() 
{ 
    string bits("11100101001001000000100000100100110100110011010001111111"); 
    cout << "returned: " << convert(bits) << endl; 
} 
+0

我可以'不知道爲什麼它是社區維基... – stefanB

+0

「[製作的社區維基]」是在您的原始文章上,所以無論您不小心點擊了複選框還是您的第20個? 30日? (我不記得數字)的答案。後者不適用,所以我只能*假設後者。我沒有按鈕「un-wiki」。 –

1

最簡單的答案是砍了一半你的字符串,將其轉換爲32位一整數,然後打包在一起。

1

這應該是訣竅,但沒有經過測試。

unsigned long binToDec(const std::string& s) 
{ 
    unsigned long d = 0; 
    for (int i = 0; i < s.size(); ++i) 
    { 
    d <<= 1; 
    if (s[i] == '1') 
     ++d; 
    } 
    return d; 
} 
+0

這就是我也會這樣做的,不需要在這裏介入bitset,特別是它不能完成整個工作。 –

+0

由於溢出問題,這不起作用。 – dirkgently

+0

這是怎麼回事,dirkgently? –

2

當您穿越ULONG_MAX時,您可能會遇到溢流。使用更大的數據類型,例如unsigned long long。但是,如果您的號碼可以大於此類型可容納的最大值,則您可能正在考慮必須實施一個bignum庫。

cube的建議,香草的C代碼:

#include <stdio.h> 
#include <stdint.h> 
#include <inttypes.h> 

uint64_t binToDec(const char * s){ 
     uint64_t res = 0; size_t i, n; 
     for (i = 0, n = strlen(s) - 1; i < n; ++i) { 
       res = (res | (unsigned int)(s[ i ] - '0')) << 1; 
     } 
     return res; 
} 

int main() { 
    /* Note the special C99 format specifier macros defined in <inttypes.h> */ 
    printf("%"PRIu64"\n", 
    binToDec("11100101001001000000100000100100110100110011010001111111")); 
} 

注:ISO C++不支持long long

+0

可能沒有改進,甚至可能比使用'unsigned long long'要包含''並使用'uint64_t' – cube

相關問題