Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 18 Marzo 2014, 22:53 pm



Título: De minúscula a mayúscula a nivel de bits (lenguaje C.)
Publicado por: NOB2014 en 18 Marzo 2014, 22:53 pm
Hola a todos.

Lenguaje………………..: "C"

Sistema operativo.….: Windows XP

Compilador……………..: MinGW

Problema………………..:Esta estructura puede tener el mismo problema que plantea rir3760 en este post. 
                              http://foro.elhacker.net/programacion_cc/operadores_a_nivel_de_bits_lenguaje_c-t410671.0.html
                                                        
Error…………….…….….: Ninguno.

Otras Observaciones..:http://foro.elhacker.net/programacion_cc/de_minuscula_a_mayuscula_a_nivel_de_bits_en_lenguaje_c-t405856.0.html (http://foro.elhacker.net/programacion_cc/de_minuscula_a_mayuscula_a_nivel_de_bits_en_lenguaje_c-t405856.0.html)


Código…………………….:


//Con uniones y campos de bit.

Código
  1. #include <stdio.h>
  2.  
  3. union caracteres
  4. {
  5. unsigned char c;
  6. struct c_bits
  7. {
  8. unsigned b0:1;
  9. unsigned b1:1;
  10. unsigned b2:1;
  11. unsigned b3:1;
  12. unsigned b4:1;
  13. unsigned b5:1;
  14. unsigned b6:1;
  15. unsigned b7:1;
  16. } bits;
  17. };
  18.  
  19. int main(void){
  20. union caracteres caracter = {110};
  21.  
  22. printf("\n\n union caracteres caracter = {110};");
  23. printf("\n\n La variable caracter contiene la letra...: \"%c\"", caracter.c);
  24.  
  25. printf("\n\n caracter.bits.b5 = 0; //Apaga el bits 5 para que la letra 'n' se transforme en 'N'");
  26. caracter.bits.b5 = 0;
  27. printf("\n\n Ahora la variable caracter contiene la letra...: \"%c\"", caracter.c);
  28.  
  29. printf("\n\n");
  30. return 0;
  31. }
  32.  

//Con máscaras y operaciones a nivel de bit.

Código
  1. #include <stdio.h>
  2.  
  3. int main(void){
  4. char letra = 'n';
  5.  
  6. printf("\n\n char letra = 'n';");
  7. printf("\n\n La variable letra contiene la letra...: \'%c\'", letra);
  8.  
  9. letra &=0xDF;
  10. printf("\n\n letra &=0xDF; // 0xDF es en binario = 1101 1111 --> pones a 0 el bit 5");
  11.  
  12. printf("\n\n Ahora la variable letra contiene la letra...: \'%c\'", letra);
  13.  
  14. printf("\n\n");
  15. return 0;
  16. }
  17.  

Saludos y como siempre muchas gracias.
Daniel 


Título: Re: De minúscula a mayúscula a nivel de bits (lenguaje C.)
Publicado por: engel lex en 18 Marzo 2014, 22:58 pm
??? que intentas?


Título: Re: De minúscula a mayúscula a nivel de bits (lenguaje C.)
Publicado por: Yoel Alejandro en 20 Marzo 2014, 15:22 pm
Por lo visto, restar 32 decimal, o sea 0x20, para pasar del código ASCII de letra mayúscula al de la respectiva minúscula. Para eso anulas el bit 5, que puedes hacer con una máscara. Revisando los códigos ASCII de todos los caracteres en mayúscula, van desde 0x61 hast 0x7A y todos poseen el bit nro. 5 en '1', por lo tanto es válido restar de este modo (hubiera sido un problema si el bit5 fuera '0', pero esto no sucede).


Título: Re: De minúscula a mayúscula a nivel de bits (lenguaje C.)
Publicado por: ivancea96 en 20 Marzo 2014, 15:37 pm
Sinó puedes hacer un XOR para ese bit, que quedaría "var ^ 32;" si no me equivoco.


Título: Re: De minúscula a mayúscula a nivel de bits (lenguaje C.)
Publicado por: rir3760 en 21 Marzo 2014, 02:44 am
//Con uniones y campos de bit.

Código
  1. #include <stdio.h>
  2.  
  3. union caracteres
  4. {
  5. unsigned char c;
  6. struct c_bits
  7. {
  8. unsigned b0:1;
  9. unsigned b1:1;
  10. unsigned b2:1;
  11. unsigned b3:1;
  12. unsigned b4:1;
  13. unsigned b5:1;
  14. unsigned b6:1;
  15. unsigned b7:1;
  16. } bits;
  17. };
La mayoría de las características de los campos de bits son "implementation defined" eso mas el detalle de dar por sentado ocho bits por byte (lo usual pero pueden ser mas, mejor usar la macro CHAR_BIT de <limits.h>).

Para el caso la recomendación es utilizar toupper, tolower, etc. cortesía de <ctype.h>, portable y sencillo.

Un saludo