2011-02-11 15 views
11

¿Por qué bitset almacena los bits en orden inverso? Después de luchar muchas veces finalmente he escrito este binary_to_dec. ¿Podría simplificarse?¿Por qué los bits de un std :: bitset están en orden inverso?

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

Por ejemplo: 'std :: string bin =" 1011 "' pero el conjunto de bits requiere que esté en orden '" 1101 "' – user4344

+2

bitset no almacena los bits en orden "inverso". Su cadena de entrada lo hace, sin embargo. –

+2

'bitset' no" requiere "nada! Básicamente es solo una matriz, y 'to_ulong()' simplemente calcula 'bit [0] * 2^0 + bit [1] * 2^1 + bit [2] * 2^2 + ..." (donde '^'denota" to-the-power-of "). –

Respuesta

30

Bitset almacena sus números en lo que se tiene en cuenta que el orden "inversa" porque escribimos los dígitos de un número en disminuyendo orden de importancia a pesar de que los caracteres de una cadena están dispuestos en aumentar índice orden.

Si escribimos nuestros números en orden little-endian, entonces no tendrías esta confusión porque el carácter en el índice 0 de tu cadena representaría el bit 0 del conjunto de bits. Pero escribimos nuestros números en orden big-endian. Me temo que no conozco los detalles de la historia humana que llevaron a esa convención. (Y tenga en cuenta que el endianness que cualquier CPU particular utiliza para almacenar números de múltiples bytes es irrelevante. Estoy hablando de la endianidad que utilizamos cuando mostramos números para que los humanos lean.)

Por ejemplo, si escribimos el decimal número 12 en binario, obtenemos 1100. El bit menos significativo está a la derecha. A eso lo llamamos "bit 0". Pero si ponemos eso en una cadena, "1100", el carácter en el índice 0 de esa cadena representa el bit 3, no el bit 0. Si creamos un conjunto de bits con los bits en el mismo orden que los caracteres, to_ulong devolvería 3 de 12.

La clase bitset tiene un constructor que acepta un std::string, pero espera que el índice del carácter coincida con el índice del bit, por lo que debe invertir la cadena. Prueba esto:

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(); 
} 

EDIT: formato y tipo de retorno.

Cuestiones relacionadas