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 5 Visitantes están viendo este tema.


DanielPy

Ok, lo voy a analizar más profundamente, lo necesito.-

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.-

leosansan

#22
Creo que esta es la salida que buscas:



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 (cpp) [Seleccionar]

#include<stdio.h>
#include <stdlib.h>
#include <math.h>

void binarioConvertir(int, char[]);

int main(void){

   char cadena[] = "daniel", cad_binaria[8] = "";
   int ascii=0, i=0, binarioMayuscula=0;

   while(i<6){
       ascii = cadena[i];
       binarioConvertir(ascii,cad_binaria);
       convertir_a_decimal(cad_binaria);
       printf("\n%c en decimal %3d en binario %s", cadena[i], ascii, cad_binaria);
       if (cad_binaria[1] = '1')
           cad_binaria[1] = '0';
       printf(" -->mayuscula-->%c-->",convertir_a_decimal(cad_binaria) );
       printf(" %s-->%d",cad_binaria,convertir_a_decimal(cad_binaria));
       i++;
   }
   printf("\n\n");
   return 0;
}

void binarioConvertir(int num, char cad[]){
   int i=0, izq=0, der=0, aux=0;
   while(num>0){
       if(num%2 == 0)
           cad[i] = '0';
       else
           cad[i] = '1';
       num = num/2;
       i++;
   }
   der=6;
   while(izq<3){
       aux      = cad[izq];
       cad[izq] = cad[der];
       cad[der] = aux;
       der--;
       izq++;
   }
   cad[7] = '\0';
}

int convertir_a_decimal (char cad[]){
   int decimal=0,i;
   for (i=6;i>=0;i--){
       if (cad[6-i]!='0'){
           decimal+=pow (2,i*((cad[6-i])-48));
       }
   }
   return decimal;


}


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! ..... !!!!



DanielPy

Hola leosansan.
CitarNo 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.-
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.-

rir3760

Cita de: DanielC# en  2 Enero 2014, 18:19 PMBueno 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:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char ch[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   int i;
   
   puts("Mayusculas a minusculas:");
   for (i = 0; i < 26; i++){
      ch[i] |= 32;
      printf("%c", ch[i]);
   }
   putchar('\n');
   
   puts("Minusculas a mayusculas:");
   for (i = 0; i < 26; i++){
      ch[i] &= 223;
      printf("%c", ch[i]);
   }
   putchar('\n');
   
   return EXIT_SUCCESS;
}


----

Por ultimo tal vez tu programa no tenga el comportamiento esperado debido a esta declaración:
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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

amchacon

#25
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 (cpp) [Seleccionar]
void binarioConvertir(int num, char cad[]){

//...

}


Yo soy más partidario de poner las llaves así porque se ve mejor cuando empieza y cuando acaba:
Código (cpp) [Seleccionar]
void binarioConvertir(int num, char cad[])
{

//...

}


Pero eso es cuestión de gustos.

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


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 (cpp) [Seleccionar]
#include <string.h>

//...

strlen(cadena);


Podemos ayudarnos de ella para reescribir la función:

Código (cpp) [Seleccionar]
int convertir_a_decimal (char cad[]){
  int decimal=0,i;

 int tam_cadena = strlen(cad);

 for (i = tam_cadena-1;i>=0;i--)
 {
      if (cad[tam_cadena-i]!='0')
      {
          decimal+=pow (2,i*((cad[tam_cadena-i])-48));
      }
 }
 return decimal;
}


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 (cpp) [Seleccionar]
int convertir_a_decimal (char cad[])
{
  int decimal=0,i;

 int tam_cadena = strlen(cad);
 int multiplicador = 1;

 for (i = 0; i < tam_cadena; i++)
 {
      if (cad[tam_cadena-i]!='0')
      {
          decimal += multiplicador * (cad[tam_cadena-i])-48);
          multiplicador *= 2;
      }
 }
 return decimal;
}


Y por último, quitaría ese 48 por un '0':
Código (cpp) [Seleccionar]
int convertir_a_decimal (char cad[])
{
 int decimal=0,i;

 int tam_cadena = strlen(cad);
 int multiplicador = 1;

 for (i = 0; i < tam_cadena; i++)
 {
      if (cad[tam_cadena-i] != '0')
      {
          decimal += multiplicador * (cad[tam_cadena-i]) - '0');
          multiplicador *= 2;
      }
 }
 return decimal;
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

rir3760

Otra forma es multiplicar el acumulado por la base y agregar el dígito:
int convertir_a_decimal(char cad[])
{
   int rv = 0;
   int i;
   
   for (i = 0; cad[i] != '\0'; i++)
      rv = rv * 2 + cad[i] - '0';
   
   return rv;
}


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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

DanielPy

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.-
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.-

leosansan

#28
Cita de: DanielC# en  3 Enero 2014, 18:58 PM
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.


Cita de: DanielC# en  3 Enero 2014, 23:22 PM
..................................................................
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 (cpp) [Seleccionar]

#include<stdio.h>
#include <stdlib.h>

int main(void){
   char cadena[100],binario[8] = "";
   int i=0;
   puts("Introduzca una  frase en minusculas:\n");
   scanf ("%100[^\n]", cadena);
   for (i=0;cadena[i] ;i++){
       printf("\n  %c en decimal %3d en binario %s", cadena[i],(int)(cadena[i]), itoa((int) (cadena[i]),binario,2 ));
       if (binario[1] = '1' )
           binario[1] = '0';
       if (!isalpha(cadena[i]))
           cadena[i]+=32;
       printf(" -->mayuscula-->%c-->",(int)(cadena[i])-32 );
       printf(" %s-->%d",binario,((int)(cadena[i])-32));
   }
   puts("\n\n");
   return 0;
}


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

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

DanielPy

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.-
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.-