2009-01-27 24 views
11

Estoy tomando una clase C++ inicial, y me gustaría convertir letras entre representaciones hexadecimales y binarias. Puedo lograr imprimir los números hexadecimales usando:¿Cómo puedo convertir números hexadecimales a binarios en C++?

for(char c = 'a'; c <= 'z'; c++){ 
    cout << hex << (int)c; 
} 

Pero no puedo hacer lo mismo con el binario. No hay std::bin que pueda usar para convertir los números decimales en binarios.

+3

Le sugiero que nos muestre un ejemplo de entrada/salida. – xtofl

Respuesta

48

así:

for(char c = 'a'; c <= 'z'; c++){ 
     std::bitset<sizeof(char) * CHAR_BIT> binary(c); //sizeof() returns bytes, not bits! 
     std::cout << "Letter: " << c << "\t"; 
     std::cout << "Hex: " << std::hex << (int)c << "\t"; 
     std::cout << "Binary: " << binary << std::endl; 
    } 
+3

¡Nunca supe esto! Esto es exactamente lo que quería el OP, y aprendí algo nuevo por mi cuenta. ¡Voto! –

+1

Aunque probablemente sea mejor hacerlo std :: bitset por si acaso. –

+0

guau ... eso es genial. Desearía poder votar más de una vez. Aún así, a pesar de lo maravilloso de tu respuesta, es una pena que hayas proporcionado un código para una pregunta sobre la tarea. – rmeador

5

No hay un manipulador binario io en C++. Debe realizar la cobertura a mano, probablemente mediante el uso de operadores de desplazamiento de bits. La conversión real no es una tarea difícil, así que debería estar dentro de las capacidades de un principiante en C++ (mientras que el hecho de que no está incluido en la biblioteca estándar puede no ser :))

Editar: Muchos otros han puesto ejemplos, así que voy a dar mi método preferido

void OutputBinary(std::ostream& out, char character) 
{ 
    for (int i = sizeof(character) - 1; i >= 0; --i) 
    { 
    out << (character >> i) & 1; 
    } 
} 

Esto también podría ser potencialmente modelado a cualquier tipo numérico.

+1

y aquí de nuevo sizeof (character) ?? ¿Ustedes c & p esto de un ejemplo con int? – AndreasT

4

Por poco de variedad, también puede hacerlo utilizando una tabla de búsqueda de 16 elementos.

+4

Acabo de darme cuenta de lo terrible que hice un juego de palabras ... lo siento: P – freespace

+0

* gemido * Sí, terrible juego de palabras. –

1

Usted puede hacer algo como esto:

for(char c = 'a'; c <= 'z'; c++){ 
    // char is 8 bits. print 4 bits 
    // at a time, starting with the MSB 
    for (int i = 4; i>=0; i-=4) { 
     switch (((int)c >> i) & 0xf) { 
      case 0: 
       cout << "0000"; 
       break; 
      case 1: 
       cout << "0001"; 
       break; 
      . 
      . 
      . 
      case 0xf: 
       cout << "1111"; 
       break; 


     } 
    } 
} 
2

Usted puede escribir un mapeo entre el hexágono charachters una de sus binarios 'picar':

std::string HexCharToNibble(char c) { 
switch (c) { 
    case '0': return "0000"; 
    case '1': return "0001"; 
    //... fill in the rest 
    case 'f': return "1111"; 
    default: assert(false); return "bad input"; 
}; 
+2

Esta versión definitivamente debe hacerse usando una tabla de búsqueda. El hecho de que el código original tenga un carácter también sería confuso. –

0

Esto suena como una tarea, en cuyo caso deberías pedirle ayuda a tu maestra. Solicitar soluciones de tareas desde Internet en realidad no te ayudará a largo plazo (a menos que vayas a la administración de proyectos).

Respondiendo a chustar (la OQ'er) en los comentarios, tendría que aceptar que si entiende cómo hacerlo, cómo/por qué funciona y cómo resolverlo en el futuro, entonces sí , eso sería una buena cosa.

Sin embargo, la respuesta que marcó como "correcta" desmiente ese argumento. No contiene nada más que código, precedido de las palabras "Like So". Está bastante claro que lo que el OQ'er estaba buscando era no para obtener una explicación, pero que alguien escriba su código para él.

+0

Es una tarea, y mientras yo Entiendo cómo hacerlo, o cómo/por qué funciona, ¿realmente importa si es de Internet o de la AT? – chustar

+3

Además, Ted, dada la respuesta de Harper Shelby anterior que me enseñó (y a juzgar por los comentarios, algunas otras personas también) algo nuevo y útil, creo que esta pregunta se ha ganado su voto favorable –

Cuestiones relacionadas