Conversión de Char a Binario en C

Estoy tratando de convertir un personaje a su representación binaria (por lo que el carácter -> ascii hex -> binario).

Sé que para hacer eso necesito cambiar y AND . Sin embargo, mi código no funciona por alguna razón.

Esto es lo que tengo. *temp apunta a un índice en una cadena C

 char c; int j; for (j = i-1; j >= ptrPos; j--) { char x = *temp; c = (x >> i) & 1; printf("%d\n", c); temp--; } 

Mostramos dos funciones que imprimen un carácter SINGLE a binario.

 void printbinchar(char character) { char output[9]; itoa(character, output, 2); printf("%s\n", output); } 

printbinchar (10) escribirá en la consola

  1010 

itoa es una función de biblioteca que convierte un único valor entero en una cadena con la base especificada. Por ejemplo … itoa (1341, salida, 10) escribirá en la cadena de salida “1341”. Y, por supuesto, itoa (9, salida, 2) escribirá en la cadena de salida “1001”.

La siguiente función imprimirá en la salida estándar la representación binaria completa de un carácter, es decir, imprimirá los 8 bits, también si los bits más altos son cero.

 void printbincharpad(char c) { for (int i = 7; i >= 0; --i) { putchar( (c & (1 < < i)) ? '1' : '0' ); } putchar('\n'); } 

printbincharpad (10) escribirá en la consola

  00001010 

Ahora presento una función que imprime una cadena completa (sin el último carácter nulo).

 void printstringasbinary(char* s) { // A small 9 characters buffer we use to perform the conversion char output[9]; // Until the first character pointed by s is not a null character // that indicates end of string... while (*s) { // Convert the first character of the string to binary using itoa. // Characters in c are just 8 bit integers, at least, in noawdays computers. itoa(*s, output, 2); // print out our string and let's write a new line. puts(output); // we advance our string by one character, // If our original string was "ABC" now we are pointing at "BC". ++s; } } 

Sin embargo, tenga en cuenta que no agrega ceros de relleno, por lo que la tira de impresión ("AB1") imprimirá algo así como:

 1000001 1000010 110001 

Su código es muy vago y no es comprensible, pero puedo ofrecerle una alternativa.

En primer lugar, si quieres que la temp pase por toda la cadena, puedes hacer algo como esto:

 char *temp; for (temp = your_string; *temp; ++temp) /* do something with *temp */ 

El término *temp como condición for simplemente comprueba si ha llegado al final de la cadena o no. Si tiene, *temp será '\0' ( NUL ) y el for fines.

Ahora, dentro del para, quieres encontrar los bits que componen *temp . Digamos que imprimimos los bits:

 for (as above) { int bit_index; for (bit_index = 7; bit_index >= 0; --bit_index) { int bit = *temp >> bit_index & 1; printf("%d", bit); } printf("\n"); } 

Para que sea un poco más genérico, es decir, convertir cualquier tipo en bits, puede cambiar el bit_index = 7 a bit_index = sizeof(*temp)*8-1

 unsigned char c; for( int i = 7; i >= 0; i-- ) { printf( "%d", ( c >> i ) & 1 ? 1 : 0 ); } printf("\n"); 

Explicación:

Con cada iteración, el bit más significativo se lee del byte desplazándolo y comparando binario con 1.

Por ejemplo, supongamos que el valor de entrada es 128, que binario se traduce en 1000 0000. Al cambiarlo por 7 se obtendrá 0000 0001, por lo que se concluye que el bit más significativo fue 1. 0000 0001 y 1 = 1. Esa es la primera parte de imprima en la consola. Las siguientes iteraciones darán como resultado 0 … 0.