Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: geeke en 11 Abril 2015, 23:57 pm



Título: Convertir entero a binario con uniones y campos de bit
Publicado por: geeke en 11 Abril 2015, 23:57 pm
Hola a todos, tengo un inconveniente a la hora de intentar entender el siguiente código

Código
  1. #include <stdio.h>
  2.  
  3. typedef union
  4. {
  5.    int entero;
  6.    struct
  7.    {
  8.        unsigned short : 7;
  9.        unsigned short valor: 1;
  10.    } bin;
  11. } conversor;
  12.  
  13. int main(void)
  14. {
  15.    int numero = 8, i;
  16.    conversor conver;
  17.    conver.entero = numero;
  18.  
  19.    for ( i = 0; i < 8; i++ )
  20.    {
  21.        printf( "%d", conver.bin.valor );
  22.        conver.entero <<= 1;
  23.    }
  24.    printf( "\n" );
  25.  
  26.    return 0;
  27. }
  28.  

Seria alguien tan amable de explicarme como convierte este código un numero entero a binario y también que hace cada miembro de la unión por ejemplo

Código
  1. unsigned short : 7;

Para que sirve esto?


Título: Re: Convertir entero a binario con uniones y campos de bit
Publicado por: Blaster en 12 Abril 2015, 05:27 am
Suponiendo que int es de 4 bytes y short es 2 conversor tendría el siguiente aspecto :

Código
  1. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX // <- conversor union
  2. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX // <- int entero
  3.                XXXXXXXXXXXXXXXX // <- struct bin
  4.                         XXXXXXX // <- campo sin nombre
  5.                        X        // <- valor

Su código establece entero a 8, que se verá así :

00000000000000000000000000001000

Luego se imprime el valor contenido en conver.bin.valor el cual mostrara el octavo bit que es cero, seguidamente desplazamos entero un bit a la izquierda resultando

00000000000000000000000000010000

Este proceso se repetirá 8 veces, pero cuando i sea igual a tres valor se establecerá a uno, en ese momento ocho sera desplazado cuatro posiciones a la izquierda dando lugar a 128 que en binario es 10000000

Como seguramente ya te has dado cuenta, el campo de bits sin nombre (unsigned short : 7;) sirve como 7 bits de relleno, de manera que a valor le corresponda el octavo bit

Un Saludo



Título: Re: Convertir entero a binario con uniones y campos de bit
Publicado por: geeke en 14 Abril 2015, 01:50 am
Hola Blaster  ;-) excelente explicación la tuya de verdad muchas gracias por tomarte el tiempo en explicar en detalle

Saludos