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();
}
Por ejemplo: 'std :: string bin =" 1011 "' pero el conjunto de bits requiere que esté en orden '" 1101 "' – user4344
bitset no almacena los bits en orden "inverso". Su cadena de entrada lo hace, sin embargo. –
'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 "). –