2010-03-09 21 views
5

tengo un problema convertir una cadena binaria a decimalproblema para convertir una cadena binaria (64 bits) a decimal (C++ en iPhone)

que estaba usando bitset

bitstring ="1011010001111111"; 

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

Todo esto funciona bien , pero !! el problema viene cuando trato de hacer lo mismo con una cadena de bits con más de 32 bits. Sé que bitset sólo lo hace la conversión de 4 bytes, pero tengo que hacer la conversión con cadenas que tiene 48 o 56 bits (a veces tengo que conseguir 14 o 15 dígitos)

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

Cualquier sugerencia? Alguien tiene una función para transformar una cadena binaria a decimal?

Nota: No puedo usar el impulso porque no está portado al iPhone.

Gracias por su ayuda

+0

partición de la cadena para encajar en 4 bytes para cada parte y luego shift-O los resultados? –

+0

fuera de tema: C++/iphone ... ¿cómo hiciste funcionar libuicaboodle o cómo se llama? o es pura linea de comandos? En caso afirmativo, ¿dónde puedo descargar la biblioteca? No lo encontré por ningún lado ... saludos – Atmocreations

+0

Nikolai: ¿cómo hago esto? – ger123

Respuesta

1

Acabo de armar esto y parece funcionar con su ejemplo, no he probado ningún valor más grande, en comparación con el resultado con la calculadora.

Salidas:

64497387062899839 

Código:

#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

I can ' t averiguar por qué es la wiki de la comunidad ... – stefanB

+0

la "[Wiki de la comunidad hecha]" está en su publicación original, entonces o accidentalmente hizo clic en la casilla de verificación o la suya fue la 20? ¿30? (No puedo recordar el número) respuesta. Este último no se aplica, por lo que * solo * puedo suponer lo último. No tengo un botón para "un-wiki". –

1

La respuesta más simple sería la de cortar la cadena de la mitad, lo convierten en un par de enteros de 32 bits y luego el paquete de ellos juntos.

1

Esto debería ser el truco, pero no se ha probado.

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

Eso es lo que yo también haría, no hay necesidad de involucrar a bitset aquí especialmente dado que no puede hacer todo el trabajo. –

+0

Esto no funcionará debido a problemas de desbordamiento. – dirkgently

+0

¿Cómo es eso, dirkgently? –

2

Usted probablemente está golpeando desbordamiento cada vez que se cruza ULONG_MAX. Use un tipo de datos más grande como unsigned long long. Sin embargo, si su número puede ser mayor que el máximo que este tipo puede contener, probablemente esté buscando implementar una biblioteca bignum.

Siguiendo la sugerencia, código cube 's de vainilla 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")); 
} 

Nota: ISO C++ no soporta long long.

+0

quizás incluso mejor que usar 'unsigned long long' es para incluir' 'y use' uint64_t' – cube

Cuestiones relacionadas