elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Estudiando función que convierte a mayúscula un carácter con operadores de bit
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Estudiando función que convierte a mayúscula un carácter con operadores de bit  (Leído 3,827 veces)
kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Estudiando función que convierte a mayúscula un carácter con operadores de bit
« en: 30 Junio 2014, 17:46 pm »

Hi la función en cuestión es esta:

Código
  1. void upper_case(char *src)
  2. {
  3.    while (*src != '\0')
  4.    {
  5.        if (islower(*src))
  6.  *src = (*src & ~0x20);
  7.        src++;
  8.    }
  9. }

No logro entender esta linea del código:

Código
  1. *src = (*src & ~0x20);

Se que el operador ~ invierte cada bit del 0x20 (i.e 32) convirtiéndolo al numero binario -11111 == -31. Supongamos que *src = 'a' al aplicar el operador &

Código
  1. 1100001
  2. -0011111
  3. _______
  4. 0000001

El resultado no es lo esperado que seria el binario 1000001 == 65 alguien podría explicarme que pasa aquí o acaso al usar el operador & sobre binarios negativos tiene otro efecto..


« Última modificación: 30 Junio 2014, 17:51 pm por kutcher » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Estudiando función que convierte a mayúscula un carácter con operadores de bit
« Respuesta #1 en: 30 Junio 2014, 18:35 pm »

~0x20 = 0xDF = -33 = 1101 1111

'a' = 0x61 = 97 = 110 0001

1101 1111
&
0110 0001
---------------
0100 0001 = 0x41 = 65 = 'A'


« Última modificación: 30 Junio 2014, 18:36 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: Estudiando función que convierte a mayúscula un carácter con operadores de bit
« Respuesta #2 en: 30 Junio 2014, 19:46 pm »

@Eternal Idol gracias por tu respuesta, solo una consulta mas porque es necesario invertir los bits de 0x20
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Estudiando función que convierte a mayúscula un carácter con operadores de bit
« Respuesta #3 en: 30 Junio 2014, 19:54 pm »

No es necesario en lo absoluto, es una forma de hacerlo, una resta de 0x20=32 a la letra en minuscula tambien daria el resultado esperado.

Mira la tabla ASCII:
http://www.asciitable.com/
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: Estudiando función que convierte a mayúscula un carácter con operadores de bit
« Respuesta #4 en: 30 Junio 2014, 20:15 pm »

No es necesario en lo absoluto, es una forma de hacerlo, una resta de 0x20=32 a la letra en minuscula tambien daria el resultado esperado.

Excelente mas claro ni el agua xD, tema resuelto
« Última modificación: 30 Junio 2014, 20:17 pm por kutcher » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Estudiando función que convierte a mayúscula un carácter con operadores de bit
« Respuesta #5 en: 30 Junio 2014, 20:17 pm »

De nadas  ::)
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: Estudiando función que convierte a mayúscula un carácter con operadores de bit
« Respuesta #6 en: 1 Julio 2014, 02:09 am »

Solo a modo de complemento al tema, quisiera añadir estos puntos de vista:

Analizando mas a fondo el código me he dado cuenta que los carácteres (A-Z) y (a-z ) todos los bits de estos son respectivamente iguales, excepto el sexto bit (contando desde la derecha)

a = 1100001     A = 1000001
b = 1100010     B = 1000010
c = 1100011     C = 1000011
d = 1100100     D = 1000100

Como pueden ver las minúsculas tienen el sexto bit a 1 y las mayúsculas a 0 en consecuencia al aplicarle el operador & con la mascara de bit apropiada logramos apagar el sexto bit y dejar los demás intactos obteniendo así su equivalente en mayúscula

1101 1111   <== Mascara de bit
&
0110 0001   <== a en binario
------------
0100 0001   <== A en binario

« Última modificación: 1 Julio 2014, 02:16 am por kutcher » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Estudiando función que convierte a mayúscula un carácter con operadores de bit
« Respuesta #7 en: 1 Julio 2014, 09:31 am »

Otra manera mas entonces, si sabemos que 0x20 = 32 = 10 0000 (en negrita el bit necesario), haciendo un XOR sobre el caracter en minuscula obtenemos el caracter en mayuscula:

97 ^ 32 = 65;

0110 0001
^
0010 0000
--------------
0100 0001

http://en.wikipedia.org/wiki/Exclusive_or

Si volvemos a aplicar la mascara:
65 ^ 32 = 97;

0100 0001
^
0010 0000
--------------
0110 0001


De esta manera tenes una funcion capaz de cambiar el case (de minuscula a mayuscula y viceversa).
« Última modificación: 1 Julio 2014, 09:35 am por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: Estudiando función que convierte a mayúscula un carácter con operadores de bit
« Respuesta #8 en: 1 Julio 2014, 16:59 pm »

De esta manera tenes una funcion capaz de cambiar el case (de minuscula a mayuscula y viceversa).

Wow.. interesante forma de hacerlo por lo versátil que es, ahora mismo lo pruebo a ver que tal
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Que funcion convierte string a codigo
Programación Visual Basic
mario_2303 9 3,021 Último mensaje 23 Noviembre 2006, 16:18 pm
por Mr.Chispa
[batch] Funcion :H2D (convierte hexa a decimal)
Scripting
The Shadow 0 1,832 Último mensaje 18 Febrero 2008, 21:40 pm
por The Shadow
funcion que devuelve un caracter
Programación C/C++
mapers 5 3,128 Último mensaje 16 Agosto 2010, 07:49 am
por leogtz
Como devuelvo un carácter desde una función.
Programación C/C++
Felipe_Henriquez 5 7,541 Último mensaje 13 Diciembre 2011, 06:12 am
por Ferno
[DUDA] Función mayúscula a minúscula y viceversa
Programación C/C++
yuna88 7 9,258 Último mensaje 20 Agosto 2015, 21:29 pm
por ismaelv
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines