De minúscula a mayúscula a nivel de bits en lenguaje C.

Iniciado por DanielPy, 31 Diciembre 2013, 00:42 AM

0 Miembros y 4 Visitantes están viendo este tema.

DanielPy

Hola a todos.
Estoy como siempre estudiando y practicando en este caso con punteros y ya logre el programa restando 32 al ascii de la letra minúscula para pasarla a mayúscula, ahora lo que quiero hacer es lo mismo pero intercambiando el sexto bit, como ya se sabe si el sexto bit está encendido la letra es minúscula y si está apagado es mayúscula.-
La primer ayuda que les pido es: ¿cómo debo  hacer para guardar el número binario en una variable del tipo int? (línea 32).-

#include <stdio.h>

void binario(int);

int main(void){

char cadena[6] = "daniel";
int ascii=0, i=0;


while(i<6){
ascii = cadena[i];
printf("\n La letra %c en decimal %3d en binario ", cadena[i], ascii);
binario(ascii);
i++;
}

printf("\n\n");

return 0;
}

void binario(int num){
int aux;

if(num==0)
      return;

aux=num%2;
num=num/2;
binario(num);
printf("%d",aux);
}


Desde ya muchas gracias y feliz 2014.-
Saludos.
Daniel

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

ivancea96

Te diría que la guardes en un array de char. Si realmente quieres guardarlo en un int, haz:
void binario(int num){
    int temp=0;
    for(int i=0; num>0; i++){
        temp+=(num%2) * pow(10, i);
        num/=10;
    }
}


Creo qeu así debería ir. No lo probé, eso te lo dej a ti :p

DanielPy

Hola ivancea96.
Me parece muy buena la idea pero no me funciona, seguiremos investigando.-

Saludos.
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

xiruko

También podrías probar a hacerlo con uniones y campos de bit. Por ejemplo:

#include <stdio.h>

union caracter
{
unsigned char c;
struct c_bits
{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
} bits;
};

int main()
{
union caracter cadena[]={'h','O','L','a'};
int len = sizeof(cadena)/sizeof(cadena[0]);
int i;

for (i=0; i<len; i++)
if (cadena[i].bits.b5 == 1)
printf("%c -> minuscula\n", cadena[i].c);
else
printf("%c -> mayuscula\n", cadena[i].c);

printf("En mayusculas: ");
for (i=0; i<len; i++)
{
cadena[i].bits.b5 = 0;
printf("%c", cadena[i].c);
}
printf("\n");

printf("En minusculas: ");
for (i=0; i<len; i++)
{
cadena[i].bits.b5 = 1;
printf("%c", cadena[i].c);
}
printf("\n");

return 0;
}


Y su salida:

xiruko:~$ gcc prueba.c -o prueba
xiruko:~$ ./prueba
h -> minuscula
O -> mayuscula
L -> mayuscula
a -> minuscula
En mayusculas: HOLA
En minusculas: hola
xiruko:~$


Saludos.

DanielPy

Hola xiruko.
Muchas gracias, muy pero muy interesante tú código, lo voy a estudiar sólo que me temo que sea un poco avanzado para mis conocimientos.-
 
Saludos.
Daniel

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

xiruko

#5
De nada. Pensándolo un poco mejor también se podría hacer con máscaras y operaciones a nivel de bit. Te dejo también el código:

#include <stdio.h>

int main()
{
char cadena[]="HoLaPEpe";
int len = sizeof(cadena)/sizeof(cadena[0])-1;
printf("len = %d\n", len);
int i;

for (i=0; i<len; i++)
// 0x20 es en binario = 0010 0000
if (cadena[i]&0x20) // devuelve cierto si el bit 5 esta puesto a 1
printf("%c -> minuscula\n", cadena[i]);
else
printf("%c -> mayuscula\n", cadena[i]);

// 0xDF es en binario = 1101 1111
for (i=0; i<len; i++) cadena[i]&=0xDF; // pones a 0 el bit 5
printf("En mayusculas: %s\n", cadena);

for (i=0; i<len; i++) cadena[i]|=0x20; // pones a 1 el bit 5
printf("En minusculas: %s\n", cadena);

return 0;
}


Y su salida:

xiruko:~$ gcc prueba2.c -o prueba2
xiruko:~$ ./prueba2
H -> mayuscula
o -> minuscula
L -> mayuscula
a -> minuscula
P -> mayuscula
E -> mayuscula
p -> minuscula
e -> minuscula
En mayusculas: HOLAPEPE
En minusculas: holapepe
xiruko:~$


Un saludo.

Edito: que puse al revés las máscaras... ahora ya funciona correctamente.

Felices fiestas.


DanielPy

Hola  xiruko.
Esto último es exactamente lo que buscaba.-
Cuando tengas un rato libre por favor explicame &0x20, 0x20 y &=0xDF.-

Saludos.
Daniel

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

xiruko

Partiendo de que 1 AND 0 = 0 y que 1 OR 0 = 1, el operador '&' es el AND a nivel de bit y el '|' el OR, y la operación se lleva a cabo entre bits que ocupen la mismas posiciones en los dos operandos. Por si no quedó del todo claro te dejo unos ejemplos:

num = 1100
num & 0100 = 0100
num & 1111 = num
num | 1001 = 1101
num | 0000 = num


Si quieres profundizar aquí tienes una explicación más detallada: http://c.conclase.net/curso/?cap=018

Un saludo.

DanielPy

Hola  xiruko.
Muchas gracias por el tiempo y muy completa explicación, solo me encontré con algo que no puedo resolver (en mayúscula).-



Saludos.
Daniel

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

ivancea96

Modificando lo que dije al principio:

Código (cpp) [Seleccionar]
int binario(int num){
    int temp=0;
    for(int i=0; num>0; i++){
        temp+=(num%2) * pow(10, i);
        num/=2;
    }
    return temp;
}


Cambiando la función de void a int, haciendo que retorne "temp", y cambiando num/=10; por "num/=2;". Eso fue un fallo mio.