2010-03-09 11 views
5

कन्वर्ट करने के लिए मैं एक दशमलवसमस्या स्ट्रिंग बाइनरी (64 बिट्स) (iphone में C++) दशमलव में

को बाइनरी एक स्ट्रिंग परिवर्तित एक समस्या है मैं bitset

bitstring ="1011010001111111"; 

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

यह सब ठीक काम करता है उपयोग कर रहा था , परंतु !! समस्या तब आती है जब मैं बिट्स स्ट्रिंग के साथ 32 बिट्स के साथ ऐसा करने की कोशिश करता हूं। मुझे पता है कि bitset केवल 4 बाइट के साथ रूपांतरण करता है, लेकिन मैं तार 48 या 56 बिट है कि के साथ रूपांतरण करने की ज़रूरत

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

किसी भी sugestion (कभी कभी मैं 14 या 15 अंक प्राप्त करने की आवश्यकता)? किसी के पास बाइनरी स्ट्रिंग को दशमलव में बदलने के लिए कोई फ़ंक्शन है?

नोट: मैं बूस्ट का उपयोग नहीं कर सकता क्योंकि यह आईफोन पर पोर्ट नहीं किया गया है।

आपकी मदद

+0

विभाजन स्ट्रिंग प्रत्येक भाग के लिए 4 बाइट में फिट और फिर शिफ्ट-या परिणामों के लिए? –

+0

ऑफ-विषय: सी ++/आईफोन ... आप कैसे काम कर रहे हैं या इसे कैसे कहा जाता है? या यह शुद्ध कमांड लाइन है? यदि हां, तो मैं पुस्तकालय कहां डाउनलोड कर सकता हूं? मुझे इसे कहीं भी नहीं मिला ... – 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-विकी" के लिए कोई बटन नहीं है। –

1

सरल जवाब है, आधे हिस्से में अपने स्ट्रिंग काटना यह 32 बिट ints की एक जोड़ी में बदलने और फिर उन्हें एक साथ पैक करने के लिए किया जाएगा के लिए धन्यवाद।

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

यही वह है जो मैं भी करूंगा, यहां बिट्सेट को शामिल करने की आवश्यकता नहीं है, विशेष रूप से यह पूरी नौकरी नहीं कर सकती है। –

+0

यह ओवरफ़्लो समस्याओं के कारण काम नहीं करेगा। – dirkgently

+0

कैसे, dirkgently? –

2

जब भी आप ULONG_MAX पार करते हैं तो आप अधिकतर ओवरफ्लो मार रहे हैं। unsigned long long जैसे बड़े डेटा प्रकार का उपयोग करें। हालांकि, यदि आपका नंबर इस प्रकार के अधिकतम से अधिक हो सकता है, तो आप शायद एक बिग्नम लाइब्रेरी को लागू करने की सोच रहे हैं।

cube के सुझाव, वेनिला सी कोड के बाद:

#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")); 
} 

नोट: आईएसओ सी ++ long long समर्थन नहीं करता।

+0

पर सुधार नहीं करता है, शायद 'हस्ताक्षर किए गए लंबे लंबे' का उपयोग करने से भी बेहतर है '' और 'uint64_t' – cube

संबंधित मुद्दे