Empacar dos caracteres en una variable entera unsigned. [C]

Iniciado por DanielPy, 22 Febrero 2015, 20:10 PM

0 Miembros y 1 Visitante están viendo este tema.

DanielPy

Hola a todos.
Creo que es la primera vez que los consulto y no puedo mostrar ningún avance, bueno debo aclarar que estoy desconcertado y no sé por dónde comenzar y les soy sincero al decir que ni siquiera pude buscar en la web.-
Dejo el enunciado y espero que puedan ayudarme con teoría o con algún ej.-    



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

engel lex

el entero lo haces igual al char 1 desplazado tantos bits como tiene char
variable_int = variable_char_1<<sizeof(char)

luego al entero le sumas el otro char
variable_int = variable_int + variable_char_2
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

rir3760

Cita de: DanielC# en 22 Febrero 2015, 20:10 PM
Es relativamente fácil, todas las variables a utilizar deben ser sin signo y la operación para empaquetar los caracteres es:
unsigned char a = ALGO;
unsigned char b = ALGO;
unsigned int r = a << CHAR_BIT | b;

/* Impresion bit por bit de la variable r */


Como imprimir una variable bit por bit es algo que ya se trato en uno de tus otros temas.

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.
engel lex, me ocurrió algo inusual con tu respuesta, cuando la leí por primera vez tenía unos ej. Que luego (de ver el partido de la selección Argentina) desaparecieron y me apareció mi post modificado (por vos) y realmente no le encuentro diferencia con el original.
rir3760, ¿me podrías decir si mi programa tiene que ver con el enunciado?  .-
Tan sólo me faltaría que alguien me diga en la práctica, ¿de qué forma se puede aplicar el empaquetado de caracteres?.-
Gracias a todos por el tiempo.-

#include <stdio.h>
#include <limits.h>

void empacaCaracteres(char a, char b);

int main(void){
unsigned char a = 'r', b = 'd';
empacaCaracteres(a, b);

getchar();
return 0;
}

void empacaCaracteres(char a, char b){
unsigned int v = a << CHAR_BIT | b;
unsigned bits = 1U << (sizeof(unsigned) * CHAR_BIT - 1), sep=0;

printf("\n\n");
while(bits){
printf(sep %8 == 0 ? " " : "");
printf(v & bits ? "1" : "0");
sep++;
bits /=2;
}
}


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

crack81

Olle daniel desde un tiempo he visto tus dudas y me gustaria saber que curso estas siguiendo o donde estas encontrando esos ejercicios

si los compartes seria fabuloso
saludos...
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

DanielPy

Hola crack81.
Te dejo la imagen de la tapa.-



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

rir3760

Cita de: DanielC# en 23 Febrero 2015, 21:38 PM¿me podrías decir si mi programa tiene que ver con el enunciado?
Tu programa realiza la operación indicada de forma correcta, solo una recomendación: no utilices la función printf para imprimir una cadena vacía. En su lugar puedes utilizar un condicional para imprimir el espacio o bien ya que se trata de imprimir un solo carácter puedes usar la función putchar y el operador condicional, de esta forma:
while (bits){
   putchar(v & bits ? '1' : '0');
   bits >>= 1;
   
   sep++;
   if (sep % CHAR_BIT == 0)
      putchar(sep == sizeof(unsigned) * CHAR_BIT ? '\n' : ' ');
}


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

engel lex

Cita de: DanielC# en 23 Febrero 2015, 21:38 PM
Hola.
engel lex, me ocurrió algo inusual con tu respuesta, cuando la leí por primera vez tenía unos ej. Que luego (de ver el partido de la selección Argentina) desaparecieron y me apareció mi post modificado (por vos) y realmente no le encuentro diferencia con el original.

jaja algunas veces corrijo detallitos en imagenes y no aviso  :)

lo que hice fue modificar tu imagen agregando el parametro " width=600" luego del img para que la imagen no se viera tan grande, sin eso se ve así



El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.