Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DanielPy en 31 Diciembre 2013, 00:42 am



Título: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: DanielPy en 31 Diciembre 2013, 00:42 am
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).-

Código
  1. #include <stdio.h>
  2.  
  3. void binario(int);
  4.  
  5. int main(void){
  6.  
  7. char cadena[6] = "daniel";
  8. int ascii=0, i=0;
  9.  
  10.  
  11. while(i<6){
  12. ascii = cadena[i];
  13. printf("\n La letra %c en decimal %3d en binario ", cadena[i], ascii);
  14. binario(ascii);
  15. i++;
  16. }
  17.  
  18. printf("\n\n");
  19.  
  20. return 0;
  21. }
  22.  
  23. void binario(int num){
  24. int aux;
  25.  
  26. if(num==0)
  27.      return;
  28.  
  29. aux=num%2;
  30. num=num/2;
  31. binario(num);
  32. printf("%d",aux);
  33. }

Desde ya muchas gracias y feliz 2014.-
Saludos.
Daniel
(http://i41.tinypic.com/2mhamg9.jpg)


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: ivancea96 en 31 Diciembre 2013, 00:53 am
Te diría que la guardes en un array de char. Si realmente quieres guardarlo en un int, haz:
Código
  1. void binario(int num){
  2.    int temp=0;
  3.    for(int i=0; num>0; i++){
  4.        temp+=(num%2) * pow(10, i);
  5.        num/=10;
  6.    }
  7. }

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


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: DanielPy en 31 Diciembre 2013, 02:59 am
Hola ivancea96.
Me parece muy buena la idea pero no me funciona, seguiremos investigando.-

Saludos.
Daniel

(http://i41.tinypic.com/2mhamg9.jpg)


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: xiruko en 31 Diciembre 2013, 03:39 am
También podrías probar a hacerlo con uniones y campos de bit. Por ejemplo:

Código
  1. #include <stdio.h>
  2.  
  3. union caracter
  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()
  20. {
  21. union caracter cadena[]={'h','O','L','a'};
  22. int len = sizeof(cadena)/sizeof(cadena[0]);
  23. int i;
  24.  
  25. for (i=0; i<len; i++)
  26. if (cadena[i].bits.b5 == 1)
  27. printf("%c -> minuscula\n", cadena[i].c);
  28. else
  29. printf("%c -> mayuscula\n", cadena[i].c);
  30.  
  31. printf("En mayusculas: ");
  32. for (i=0; i<len; i++)
  33. {
  34. cadena[i].bits.b5 = 0;
  35. printf("%c", cadena[i].c);
  36. }
  37. printf("\n");
  38.  
  39. printf("En minusculas: ");
  40. for (i=0; i<len; i++)
  41. {
  42. cadena[i].bits.b5 = 1;
  43. printf("%c", cadena[i].c);
  44. }
  45. printf("\n");
  46.  
  47. return 0;
  48. }

Y su salida:

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

Saludos.


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: DanielPy en 31 Diciembre 2013, 03:50 am
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
(http://i41.tinypic.com/2mhamg9.jpg)


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: xiruko en 31 Diciembre 2013, 03:58 am
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:

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. char cadena[]="HoLaPEpe";
  6. int len = sizeof(cadena)/sizeof(cadena[0])-1;
  7. printf("len = %d\n", len);
  8. int i;
  9.  
  10. for (i=0; i<len; i++)
  11. // 0x20 es en binario = 0010 0000
  12. if (cadena[i]&0x20) // devuelve cierto si el bit 5 esta puesto a 1
  13. printf("%c -> minuscula\n", cadena[i]);
  14. else
  15. printf("%c -> mayuscula\n", cadena[i]);
  16.  
  17. // 0xDF es en binario = 1101 1111
  18. for (i=0; i<len; i++) cadena[i]&=0xDF; // pones a 0 el bit 5
  19. printf("En mayusculas: %s\n", cadena);
  20.  
  21. for (i=0; i<len; i++) cadena[i]|=0x20; // pones a 1 el bit 5
  22. printf("En minusculas: %s\n", cadena);
  23.  
  24. return 0;
  25. }

Y su salida:

Código:
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.



Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: DanielPy en 31 Diciembre 2013, 04:10 am
Hola  xiruko.
Esto último es exactamente lo que buscaba.-
Cuando tengas un rato libre por favor explicame &0x20, 0x20 y &=0xDF.-

Saludos.
Daniel
(http://i41.tinypic.com/2mhamg9.jpg)


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: xiruko en 31 Diciembre 2013, 04:28 am
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:

Código:
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 (http://c.conclase.net/curso/?cap=018)

Un saludo.


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: DanielPy en 31 Diciembre 2013, 14:38 pm
Hola  xiruko.
Muchas gracias por el tiempo y muy completa explicación, solo me encontré con algo que no puedo resolver (en mayúscula).-

(http://i44.tinypic.com/2hmdi4j.jpg)

Saludos.
Daniel
(http://i41.tinypic.com/2mhamg9.jpg)


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: ivancea96 en 31 Diciembre 2013, 15:45 pm
Modificando lo que dije al principio:

Código
  1. int binario(int num){
  2.    int temp=0;
  3.    for(int i=0; num>0; i++){
  4.        temp+=(num%2) * pow(10, i);
  5.        num/=2;
  6.    }
  7.    return temp;
  8. }

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


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: rir3760 en 31 Diciembre 2013, 16:01 pm
solo me encontré con algo que no puedo resolver (en mayúscula).
El problema se debe a la conversión del espacio en "Roberto Daniel", este se sustituye por el carácter '\0' y es la causa de que solo se imprime la primera palabra.

Para solucionarlo solo debes convertir los caracteres alfabéticos, esa verificación la puedes realizar con la función isalpha (prototipo en <ctype.h>).

Un saludo


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: DanielPy en 31 Diciembre 2013, 16:44 pm
Hola ivancea96.
Ok, funciona a la perfección y complementándolo con lo de xiruko tengo todo resuelto (igual lo de xiruko no se le puede cambiar nada), además me da mucha satisfacción cuando el código es extremadamente conciso, feliz 2014.-
Hola rir3760, muchas gracias por el aporte, feliz 2014.-


feliz 2014 para todos.
Saludos.
Daniel
(http://i41.tinypic.com/2mhamg9.jpg)


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: leosansan en 31 Diciembre 2013, 22:30 pm
...................................
Pensándolo un poco mejor también se podría hacer con máscaras y operaciones a nivel de bit.
Felices fiestas.
......................................

Sólo le veo un pero a lo que haces: modificas la cadena. Y si tuviera que usarla a posteriori no le valdría, a no ser que haga una copia previa de la cadena.  Es una chorrada, ¡¡pero!!, podría ser.

Lo que yo propongo es cuasi-igual, sólo que no modifico la cadena original tan solo la imprimo y paso de la variable "len" ya que se puede evitar su uso.

Salida:


Citar
L -> mayuscula
e -> minuscula
o -> minuscula
S -> mayuscula
a -> minuscula
n -> minuscula
S -> mayuscula
a -> minuscula
n -> minuscula
  -> minuscula
L -> mayuscula
e -> minuscula
o -> minuscula
N -> mayuscula

En mayusculas: LEOSANSAN LEON

En minusculas: leosansan leon



Código
  1. #include <stdio.h>
  2.  
  3. int main(){
  4. char  cadena[]="LeoSanSan LeoN";
  5. int i;
  6. for (i=0; cadena[i]; i++)
  7. if( cadena[i] & 0x20 )
  8. printf("%c -> minuscula\n", cadena[i]);
  9. else
  10. printf("%c -> mayuscula\n", cadena[i]);
  11.  
  12. printf("\nEn mayusculas: ");
  13. for (i=0; cadena[i]; i++)
  14. printf("%c", cadena[i]& 0xDF);
  15. putchar ('\n');
  16. printf("\nEn minusculas: ");
  17. for (i=0; cadena[i]; i++)
  18. printf("%c", cadena[i]| 0x20);
  19.    putchar ('\n');
  20. return 0;
  21. }
  22.  

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)


¡¡¡¡ Saluditos! ..... !!!!

P.D: Por ciero, ¿Daniel, Roberto o Pino1952 (http://www.indetectables.net/viewtopic.php?f=36&p=433451&sid=2fddfd30c9f9e88c3865af014aa6f49f) ?

(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: DanielPy en 31 Diciembre 2013, 22:55 pm
Hola leosansan.-
Amigo, muy bien otra muy buena idea, excelente.-

Citar
P.D: Por ciero, ¿Daniel, Roberto o Pino1952 ?
Me llaman Roberto Daniel Virgili(Dani para las chicas menores de 30)y el seudónimo Pino1952 es también mio, la intriga es porque frecuentas ese foro, espero urgente respuesta… :huh: :huh: :huh: :) :) :)
     
Saludos.
Daniel
(http://i41.tinypic.com/2mhamg9.jpg)


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: leosansan en 31 Diciembre 2013, 23:01 pm
........................................................
la intriga es porqué frecuentas ese foro, espero urgente respuesta… :huh: :huh: :huh: :) :) :)
    
Saludos.
Daniel


¿Es que crees que este es el único foro con acción?. Pues no, pero sin dudarlo un instante:es el más activo y entretenido. Se aprende un *uevo. ;) ;) ;)

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: DanielPy en 2 Enero 2014, 18:19 pm
Hola amigos.
Bueno el caso es que ahora necesito que me digan cómo seguir,  ¿como paso el nuevo binario a la “d”  para que se transforme en “D”?.-
Los código que Uds. expusieron no tienen desperdicio pero después de tanta información suelo hacer mi propia versión para practicar y asimilar lo expuesto.-
ivancea96, ya que no puedo lograrlo espero que hagas un esfuerzo para refinar tú código me da resultados inesperados (ver imagen), lo necesito para hacer mi programa más conciso, no tener que poner el resultado binario en una cadena y luego pasarlo a entero.-

(http://i42.tinypic.com/s6tao6.jpg)

Espero que se entienda lo expuesto en la primer parte, es lo que me falta para pasar de “daniel” a “Daniel”.-     


Código
  1. #include<stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void binarioConvertir(int, char[]);
  5.  
  6. int main(void){
  7.  
  8.    char cadena[6] = "daniel", cad_binaria[8] = "";
  9.    int ascii=0, i=0, binarioMayuscula=0;
  10.  
  11.    while(i<6){
  12.        ascii = cadena[i];
  13.        binarioConvertir(ascii,cad_binaria);      
  14.        printf("\n La letra %c en decimal %3d en binario %s", cadena[i], ascii, cad_binaria);
  15.        cad_binaria[1] = '0';
  16.        printf(" mayuscula --> %s", cad_binaria);
  17.        binarioMayuscula = atoi(cad_binaria);
  18. i++;
  19.    }    
  20.    printf("\n\n");  
  21.  
  22.    return 0;
  23. }
  24.  
  25. void binarioConvertir(int num, char cad[]){
  26.    int i=0, izq=0, der=0, aux=0;
  27.    while(num>0){
  28.        if(num%2 == 0)
  29.            cad[i] = '0';
  30.        else
  31.            cad[i] = '1';
  32.        num = num/2;
  33.        i++;
  34.    }
  35.    der=6;
  36.    while(izq<3){
  37.        aux      = cad[izq];
  38.        cad[izq] = cad[der];;
  39.        cad[der] = aux;
  40.        der--;
  41.        izq++;
  42.    }
  43.    cad[7] = '\0';
  44. }

Saludos.
Daniel   
(http://i41.tinypic.com/2mhamg9.jpg)


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: ivancea96 en 2 Enero 2014, 20:56 pm
Bueno, en priemr lugar, es eno es mi código -.-'
En segundo lugar, a mi me da resultados correctos.


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: DanielPy en 2 Enero 2014, 21:09 pm
Hola ivancea96.
Ese no es el del error, el que dejo a continuación es el que me da resultados incorrectos, es obvio que es mío el error pero no logro corregirlo.-

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. void binario(int);
  5.  
  6. int main(void){
  7.  
  8. char cadena[6] = "daniel";
  9. int ascii=0, i=0;
  10.  
  11. while(i<6){
  12. ascii = cadena[i];
  13. printf("\n La letra %c en decimal %3d en binario ", cadena[i], ascii);
  14. binario(ascii);
  15. i++;
  16. }
  17.  
  18. printf("\n\n");
  19.  
  20. return 0;
  21. }
  22.  
  23. void binario(int num){
  24. int temp=0, i;
  25. for(i=0; num>0; i++){
  26. temp+=(num%2) * pow(10, i);
  27. num/=2;
  28. }
  29. printf(" %d", temp);
  30. }

Saludos.
Daniel   
(http://i41.tinypic.com/2mhamg9.jpg)



Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: ivancea96 en 3 Enero 2014, 00:24 am
A mi me va perfecto.


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: DanielPy en 3 Enero 2014, 00:35 am
Hola.
Una última cosa, ¿copiaste y pegaste el código que yo postee?.-

Saludos.
Daniel


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: ivancea96 en 3 Enero 2014, 01:01 am
Sí.


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: DanielPy en 3 Enero 2014, 01:09 am
Ok, lo voy a analizar más profundamente, lo necesito.-

Saludos.
Daniel


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: leosansan en 3 Enero 2014, 18:10 pm
Creo que esta es la salida que buscas:

(http://i1280.photobucket.com/albums/a497/leosansan/GRAFICOS1/mayusculasbinario_zps3edf8e1f.jpg)

No me gusta ni pizca el código que te paso, pero no quería modificarte el tuyo de forma sustancial: :rolleyes: :rolleyes: :rolleyes:

Código
  1. #include<stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. void binarioConvertir(int, char[]);
  6.  
  7. int main(void){
  8.  
  9.    char cadena[] = "daniel", cad_binaria[8] = "";
  10.    int ascii=0, i=0, binarioMayuscula=0;
  11.  
  12.    while(i<6){
  13.        ascii = cadena[i];
  14.        binarioConvertir(ascii,cad_binaria);
  15.        convertir_a_decimal(cad_binaria);
  16.        printf("\n%c en decimal %3d en binario %s", cadena[i], ascii, cad_binaria);
  17.        if (cad_binaria[1] = '1')
  18.            cad_binaria[1] = '0';
  19.        printf(" -->mayuscula-->%c-->",convertir_a_decimal(cad_binaria) );
  20.        printf(" %s-->%d",cad_binaria,convertir_a_decimal(cad_binaria));
  21.        i++;
  22.    }
  23.    printf("\n\n");
  24.    return 0;
  25. }
  26.  
  27. void binarioConvertir(int num, char cad[]){
  28.    int i=0, izq=0, der=0, aux=0;
  29.    while(num>0){
  30.        if(num%2 == 0)
  31.            cad[i] = '0';
  32.        else
  33.            cad[i] = '1';
  34.        num = num/2;
  35.        i++;
  36.    }
  37.    der=6;
  38.    while(izq<3){
  39.        aux      = cad[izq];
  40.        cad[izq] = cad[der];
  41.        cad[der] = aux;
  42.        der--;
  43.        izq++;
  44.    }
  45.    cad[7] = '\0';
  46. }
  47.  
  48. int convertir_a_decimal (char cad[]){
  49.    int decimal=0,i;
  50.    for (i=6;i>=0;i--){
  51.        if (cad[6-i]!='0'){
  52.            decimal+=pow (2,i*((cad[6-i])-48));
  53.        }
  54.    }
  55.    return decimal;
  56.  
  57.  
  58. }
  59.  

Todo es jugar con el valor del caracter en la posición 1.

Te he añadido la conversión a decimal usando las potencias de 2. Lo he hecho con "pow" por ganseria xD. ;)


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: DanielPy en 3 Enero 2014, 18:58 pm
Hola leosansan.
Citar
No me gusta ni pizca el código que te paso, pero no quería modificarte el tuyo de forma sustancial:
Te pido por favor que la próxima vez, si tenes que utilizar este tipo de aclaraciones prefiero que no me contestes o que me pidas que no efectúe nuevo post.-
Yo soy un autodidacta y dependo muchísimo de los foros, con tu aclaración me estás dando a entender que mi código está mal, perfecto lo acepto y acepto me falta mucho por aprender, no sería mejor que pusieras un programa como el que hiciste pero a tu manera y de esa forma me dieras la  posibilidad de aprender la forma correcta de hacerlo.-       

Muchas gracias por tu tiempo.-


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: rir3760 en 3 Enero 2014, 19:40 pm
Bueno el caso es que ahora necesito que me digan cómo seguir,  ¿como paso el nuevo binario a la “d”  para que se transforme en “D”?
Si la intención es realizar las operaciones a nivel de bits entonces para pasar de:
A) Mayúsculas a minúsculas, debes activar el sexto bit mediante el operador "|" y una mascara (el valor 32).
B) Minúsculas a mayúsculas, debes desactivar el sexto bit mediante el operador "&" y una mascara (el valor opuesto al anterior, 223).

Un programa de ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char ch[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  7.   int i;
  8.  
  9.   puts("Mayusculas a minusculas:");
  10.   for (i = 0; i < 26; i++){
  11.      ch[i] |= 32;
  12.      printf("%c", ch[i]);
  13.   }
  14.   putchar('\n');
  15.  
  16.   puts("Minusculas a mayusculas:");
  17.   for (i = 0; i < 26; i++){
  18.      ch[i] &= 223;
  19.      printf("%c", ch[i]);
  20.   }
  21.   putchar('\n');
  22.  
  23.   return EXIT_SUCCESS;
  24. }

----

Por ultimo tal vez tu programa no tenga el comportamiento esperado debido a esta declaración:
Código
  1. char cadena[6] = "daniel";
Con ella se crea un array de seis elementos inicializados con los caracteres indicados pero falta el indicador de fin de cadena (el '\0'), para que este se agregue de forma automática debes eliminar el numero de elementos del array o bien indicar el numero correcto (siete).

Un saludo


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: amchacon en 3 Enero 2014, 19:46 pm
Ten en cuenta Daniel, que el hecho de que te guste un código o no a veces es un poco subjetivo. Lo que le guste a Leo no tiene porque ser siempre lo que te guste a tí o a mí. Por ejemplo en las declaraciones de función:
Código
  1. void binarioConvertir(int num, char cad[]){
  2.  
  3. //...
  4.  
  5. }

Yo soy más partidario de poner las llaves así porque se ve mejor cuando empieza y cuando acaba:
Código
  1. void binarioConvertir(int num, char cad[])
  2. {
  3.  
  4. //...
  5.  
  6. }

Pero eso es cuestión de gustos.

Bueno y ya hablando del código, esta función:
Código
  1. int convertir_a_decimal (char cad[]){
  2.   int decimal=0,i;
  3.   for (i=6;i>=0;i--){
  4.       if (cad[6-i]!='0'){
  5.           decimal+=pow (2,i*((cad[6-i])-48));
  6.       }
  7.   }
  8.   return decimal;
  9. }

Esa función no es muy portable, puesto que para que funcione la cadena debe medir exactamente 6 caracteres.

Existe una función de la librería estándar que te calcula el tamaño de una cadena:
Código
  1. #include <string.h>
  2.  
  3. //...
  4.  
  5. strlen(cadena);

Podemos ayudarnos de ella para reescribir la función:

Código
  1. int convertir_a_decimal (char cad[]){
  2.   int decimal=0,i;
  3.  
  4.  int tam_cadena = strlen(cad);
  5.  
  6.  for (i = tam_cadena-1;i>=0;i--)
  7.  {
  8.       if (cad[tam_cadena-i]!='0')
  9.       {
  10.           decimal+=pow (2,i*((cad[tam_cadena-i])-48));
  11.       }
  12.  }
  13.  return decimal;
  14. }

De esa forma esta función te valdrá para cualquier tamaño de cadena, por lo que la podrás reutilizar siempre que quieras.

Y aunque no la pienses reutilizar, es una buena costumbre hacer las funciones lo más generales posibles, de lo contrario te podrías encontrar con errores extraños si modificas el código.

Y siguiendo otra vez con la función, ese pow no es necesario. Podemos definir la potencia aprovechando las iteraciones del for, lo que haremos es cambiar el sentido del for y añadir una variable más:

Código
  1. int convertir_a_decimal (char cad[])
  2. {
  3.   int decimal=0,i;
  4.  
  5.  int tam_cadena = strlen(cad);
  6.  int multiplicador = 1;
  7.  
  8.  for (i = 0; i < tam_cadena; i++)
  9.  {
  10.       if (cad[tam_cadena-i]!='0')
  11.       {
  12.           decimal += multiplicador * (cad[tam_cadena-i])-48);
  13.           multiplicador *= 2;
  14.       }
  15.  }
  16.  return decimal;
  17. }

Y por último, quitaría ese 48 por un '0':
Código
  1. int convertir_a_decimal (char cad[])
  2. {
  3.  int decimal=0,i;
  4.  
  5.  int tam_cadena = strlen(cad);
  6.  int multiplicador = 1;
  7.  
  8.  for (i = 0; i < tam_cadena; i++)
  9.  {
  10.       if (cad[tam_cadena-i] != '0')
  11.       {
  12.           decimal += multiplicador * (cad[tam_cadena-i]) - '0');
  13.           multiplicador *= 2;
  14.       }
  15.  }
  16.  return decimal;
  17. }


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: rir3760 en 3 Enero 2014, 20:13 pm
Otra forma es multiplicar el acumulado por la base y agregar el dígito:
Código
  1. int convertir_a_decimal(char cad[])
  2. {
  3.   int rv = 0;
  4.   int i;
  5.  
  6.   for (i = 0; cad[i] != '\0'; i++)
  7.      rv = rv * 2 + cad[i] - '0';
  8.  
  9.   return rv;
  10. }

Una opción mejor es la función strtol, parte de la biblioteca estándar de C y con soporte para las bases 2 a 36.

Un saludo


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: DanielPy en 3 Enero 2014, 23:22 pm
Hola a todos.
Muchas pero muchas gracias a todos, vaya que predisposición para ayudar, por favor sigan así, no se puede pedir más, realmente con todas estas respuesta se podría hacer un tutorial.-
Leosansan, con mis 61 años debo reconocer que siempre fui muy visceral extremadamente franco y en este caso te pido disculpas si fui muy duro pero es lo que sentí en el momento, y para que veas que me hago cargo de mis errores voy a dejar de postear el elhacker.net, de esta manera trato de no perjudicarte, es preferible que te quedes vos que podes ayudar a muchos y no yo que he dejado un triste antecedente.-

Saludo a todos los genios que ayudan y a todos los que vienen a buscar soluciones que seguramente la encontraran.-
Hasta siempre.
Roberto Daniel Virgili.-


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: leosansan en 4 Enero 2014, 10:28 am
Hola leosansan.Te pido por favor que la próxima vez, si tenes que utilizar este tipo de aclaraciones prefiero que no me contestes o que me pidas que no efectúe nuevo post.-
Yo soy un autodidacta y dependo muchísimo de los foros, con tu aclaración me estás dando a entender que mi código está mal, perfecto lo acepto y acepto me falta mucho por aprender, no sería mejor que pusieras un programa como el que hiciste pero a tu manera y de esa forma me dieras la  posibilidad de aprender la forma correcta de hacerlo.  



Estamos en el mismo barco, yo también soy autodidacta.

Respecto a lo segundo soy de la opinión de cuando alguien postea un código y tiene algún error procedo a la corrección pertinente respetando en lo posible su código, no a poner un código que a mí se me ocurra, ya que puede que el nivel no sea el mismo y no le sirva, y no es porque mi nivel sea alto, todo lo contrario.


..................................................................
Leosansan, con mis 61 años debo reconocer que siempre fui muy visceral extremadamente franco y en este caso te pido disculpas si fui muy duro pero es lo que sentí en el momento, y para que veas que me hago cargo de mis errores voy a dejar de postear el elhacker.net, de esta manera trato de no perjudicarte, es preferible que te quedes vos que podes ayudar a muchos y no yo que he dejado un triste antecedente.-
..........................................


Casi te pillo, yo tengo 59 años y como tu, además de autodidacta, soy muy crítico conmigo mismo, así que si te he ofendido en algo te pido humildemente disculpas. Pero sinceramente no sé que he podido decir que te haya ofendido ;).

No entiendo por qué quieres dejar de postear en este foro. Creo que se te ha ayudado de forma presta e intensa: ivancea96, rir3760, amchacon y yo mismo.

No entiendo por qué dices que lo haces por no perjudicarme, todo lo contrario, me has ayudado a refrescar cositas sobre números en binario y máscaras de bits.  :rolleyes:

Y para que veas que te respeto y admiro, como en mi caso, al meterte en este mundillo con tu edad y por ti solo, te dejo una nueva solución, esta vez partiendo de cero, usando las funciones que el C pone a nuestra disposición. Por no usar, no he usado ni strlen como sugirió amchacon:


Citar
Introduzca una  frase en minusculas:

rir amchacon leosansan

  r en decimal 114 en binario 1110010 -->mayuscula-->R--> 1010010-->82
  i en decimal 105 en binario 1101001 -->mayuscula-->I--> 1001001-->73
  r en decimal 114 en binario 1110010 -->mayuscula-->R--> 1010010-->82
    en decimal  32 en binario 100000 -->mayuscula--> --> 100000-->32

  a en decimal  97 en binario 1100001 -->mayuscula-->A--> 1000001-->65
  m en decimal 109 en binario 1101101 -->mayuscula-->M--> 1001101-->77
  c en decimal  99 en binario 1100011 -->mayuscula-->C--> 1000011-->67
  h en decimal 104 en binario 1101000 -->mayuscula-->H--> 1001000-->72
  a en decimal  97 en binario 1100001 -->mayuscula-->A--> 1000001-->65
  c en decimal  99 en binario 1100011 -->mayuscula-->C--> 1000011-->67
  o en decimal 111 en binario 1101111 -->mayuscula-->O--> 1001111-->79
  n en decimal 110 en binario 1101110 -->mayuscula-->N--> 1001110-->78
    en decimal  32 en binario 100000 -->mayuscula--> --> 100000-->32

  l en decimal 108 en binario 1101100 -->mayuscula-->L--> 1001100-->76
  e en decimal 101 en binario 1100101 -->mayuscula-->E--> 1000101-->69
  o en decimal 111 en binario 1101111 -->mayuscula-->O--> 1001111-->79
  s en decimal 115 en binario 1110011 -->mayuscula-->S--> 1010011-->83
  a en decimal  97 en binario 1100001 -->mayuscula-->A--> 1000001-->65
  n en decimal 110 en binario 1101110 -->mayuscula-->N--> 1001110-->78
  s en decimal 115 en binario 1110011 -->mayuscula-->S--> 1010011-->83
  a en decimal  97 en binario 1100001 -->mayuscula-->A--> 1000001-->65
  n en decimal 110 en binario 1101110 -->mayuscula-->N--> 1001110-->78



Código
  1. #include<stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void){
  5.    char cadena[100],binario[8] = "";
  6.    int i=0;
  7.    puts("Introduzca una  frase en minusculas:\n");
  8.    scanf ("%100[^\n]", cadena);
  9.    for (i=0;cadena[i] ;i++){
  10.        printf("\n  %c en decimal %3d en binario %s", cadena[i],(int)(cadena[i]), itoa((int) (cadena[i]),binario,2 ));
  11.        if (binario[1] = '1' )
  12.            binario[1] = '0';
  13.        if (!isalpha(cadena[i]))
  14.            cadena[i]+=32;
  15.        printf(" -->mayuscula-->%c-->",(int)(cadena[i])-32 );
  16.        printf(" %s-->%d",binario,((int)(cadena[i])-32));
  17.    }
  18.    puts("\n\n");
  19.    return 0;
  20. }
  21.  

¡¡¡¡ Saluditos! ..... !!!!

:rolleyes: ;) ;) ;) :rolleyes:


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: DanielPy en 4 Enero 2014, 15:00 pm
Hola a todos.
Si bien este es un foro de programación para que se me entienda mejor tengo que introducir un poco de teoría sobre lo que realmente vine a aprender en esta reencarnación (como en las anteriores) que es a evolucionar, tengo que observar mis errores y haciéndome cargo voy solucionando cosas paso a paso y este es uno de ellos, estoy muy consciente que viendo lo que está pasando humanamente voy a perder mucho sin la ayuda de todos Uds. pero priorizo lo espiritual, luego Dios (como siempre) me presentará a otros hermanos para que me enseñen (si el karma no está aprendido tal vez sean Uds. mismo, el padre me lo hará saber).-

Amigos, un gran abrazo a la distancia y que tengan un muy buen día.-

“Yo solo digo lo que vos necesitas escuchar”
Roberto Daniel Virgili.-


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: leosansan en 4 Enero 2014, 17:25 pm
Esta vez no has realizado consulta alguna sobre código o cosas similares. Te has limitado a expresar una opinión y ante ello me veo en la obligación de responder con mi propia opinión.

.......................................
“Yo solo digo lo que vos necesitas escuchar”
Roberto Daniel Virgili.-

...............................

Modestia no te falta al dar una cita propia, pero veo muy pretencioso por tu parte que lo que digas es lo que quiera y/o necesite escuchar yo. Más bien que no.


...............................
Si bien este es un foro de programación para que se me entienda mejor tengo que introducir un poco de teoría sobre lo que realmente vine a aprender
.................................................

Ahí has dado en el clavo, este es un foro de programación en el que gente como yo, o tú, expone dudas, consultas o solicita información sobre algún otro tema concreto y así vamos complementando la formación, bien académica o bien autodidacta, como es nuestro caso. Yo no paro de aprender cosas nuevas cada día, sin dudarlo un instante es un buen foro y lo hacen bueno todas esas personas anónimas que "nos regalan" su propio tiempo y sus conocimientos. No es algo habitual en estos tiempos que corren, así que desde aquí gracias a todos.


...........................................................................
lo que realmente vine a aprender en esta reencarnación (como en las anteriores) que es a evolucionar..
.................................................

Lo ves, expresas una opinión o idea existencial, nada de dudas o consultas. Y me parece respetable en este caso tu creencia, pero ....pues va a ser que no, que para  nada comparto tu creencia. ¿Te basas en algún dato y/o prueba de carácter científico que sostenga semejante aseveración?. ¿O te ha dado en creer por creer?. Respeto las creencias que sean respetables con nuestro modelo de valores humanos, pero creer por creer, como que no. No me mueve la fe sino las pruebas y/o los conocimientos comprobables científicamente, lo demás se reduce, y repito otra vez, a creer por creer, vamos un acto simple, puro y duro de fe, que por cierto ni mueve montañas ni nada por el estilo.


..............................................................
estoy muy consciente que viendo lo que está pasando humanamente voy a perder mucho sin la ayuda de todos Uds.
.................................................


En este punto te doy la razón por lo que ya he expuesto. Yo estoy presente en este foro para aprender y , si cuadra en mis escasos conocimientos, ayudar.


.....................................................
pero priorizo lo espiritual.........
..............................

Amén. Pero con lo espiritual sostengo lo mismo que con tu otra creencia sobre la reencarnación. ¿Dónde está el espíritu?, ¿pesa, tiene color, huele, es bueno, malo, cambia con el tiempo, alguien lo ha podido medir y/o ver?.  Y ya es raro, teniendo en cuenta los milenios que la humanidad arrastra esas creencias ancestrales que no se tenga ni *uta idea con respecto al mismo.Pues va a ser que no. ;) :rolleyes: ;)

........................................................
luego Dios (como siempre) me presentará a otros hermanos para que me enseñen
....................................


Has mentado una palabra mágica:DIOS. Sólo tengo una duda, para aquellos que creen en su existencia: ¿es bueno o malo?. ¿Ese ser creador y todopoderoso es el mismo que permite las grandes tragedias humanas?. Vamos, por poner solo un par de ejemplos, la muerte de más de 50.000 personas por culpa de un ciclón en Filipinas o la muerte de más de 250.000 personas por un maremoto en Indonesia, por no hablar de la lotería de nacer en el primer o tercer mundo.¡¡Ahh!!, me olvidaba, los designios de dios son inescrutables. Bonita frase para justificar las innumerables obras de un ser que, caso de existir, debe ser despiadado y/o malvado.

.........................
si el karma no está aprendido tal vez sean Uds. mismo, el padre me lo hará saber
...............................


¿Qué pasa?, ¿tienes comunicación directa con él ?, lo digo por eso de que te lo hará saber. ¡¡¡Ah, claro!!!, te refiere a de forma indirecta, vamos alguna iluminación. ¡¡¡Vamos hombre!!!, que ya somos mayorcitos.

Conste que he procurado ser breve en las respuestas y respetuoso con tus creencias pero claro, como dicen en mi tierra, "donde no hay mata no hay patata".

Fíjate en la de opiniones que encerraban tu escueta despedida de este foro y espero por el bien de tu/mi aprendizaje que no se produzca. Todas la aportaciones intelectuales, que no opiniones, nos enriquecen . ;) ;) ;)


¡¡¡¡ Saluditos! ..... !!!!

:rolleyes: ;) ;) ;) :rolleyes:


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: DanielPy en 4 Enero 2014, 18:30 pm
Hola leo.-
Antes de dar de baja mi cuenta te dejo un último mensaje, yo a diario hablo con Dios, yo si escucho en mi interior “aquiétate y sabe que yo soy Dios”, yo siento con un suspiro muy profundo la bajada del espíritu santo.-

Si me necesitas hay estoy.-

vsupermonaco@gmail.com
rdvsm2179@gmail.com
rdvsm316@yahoo.es
 
Te abrazo a la distancias (ya con algunas lagrimas que enpiezan a caer) te adoro hermano y espero que seas muy pero muy feliz.-

Daniel


Título: Re: De minúscula a mayúscula a nivel de bits en lenguaje C.
Publicado por: leosansan en 4 Enero 2014, 19:12 pm

Antes de dar de baja mi cuenta te dejo un último mensaje, yo a diario hablo con Dios, yo si escucho en mi interior “aquiétate y sabe que yo soy Dios”, yo siento con un suspiro muy profundo la bajada del espíritu santo.-
.......................................................
Te abrazo a la distancias (ya con algunas lagrimas que enpiezan a caer) te adoro hermano y espero que seas muy pero muy feliz.-



Un abrazo igualmente para tí. ;) ;) ;)

Pero me preocupa seriamente eso de hables con alguien que nadie ha visto ni oído, físicamente hablando, y lo de que escuches voces en tu interior me suena más a enfermedad psiquiátrica que a otra cosa.

Te aconsejaría una consulta
con el profesional de turno, puede ir a peor si no se trata adecuadamente esos síntomas de hablar con alguien que no está presente o escuchar voces estando solo, por no hablar de esos suspiros sin razón lógica aparente.

¿Seguro que nunca te has planteado ir al siquiatra?
. Y no te lo digo en plan de sorna y/o cachondeo, es algo natural la visita a un profesional. Yo, sin ir más lejos, estuve internado, es decir encerrado a cal y canto, en un psiquiátrico `más de dos meses para deshabituarme de la morfina que durante cinco años me estuvieron dando los médicos para soportar un cáncer y sus consecuencias. Como creían que me moría si o si, se pasaron en las dosis de morfina, todo con la buena intención de que no sufriera hasta que se produjera el óbito, cosa que como puedes comprobar no se ha producido. Y por cierto, también escuchaba voces y hablaba con personas que sólo estaban en mi imaginación. Por eso te aconsejo una consulta. :rolleyes: :rolleyes: :rolleyes:

Y a lo importante, no nos abandones. Es uno de los mejores foros de programación. Ya te indiqué que yo cada día aprendo mogollón de cosas. ¡¡¡Anímate!!!.

Por cierto, no me has comentado nada del último código que posteé. Me resultó molón.


¡¡¡¡ Saluditos! ..... !!!!

:rolleyes: ;) ;) ;) :rolleyes: