2010-03-18 35 views
12

he campo de bits declarado de esta manera:conversión de Campo de Bits a int

typedef struct morder { 
    unsigned int targetRegister : 3; 
    unsigned int targetMethodOfAddressing : 3; 
    unsigned int originRegister : 3; 
    unsigned int originMethodOfAddressing : 3; 
    unsigned int oCode : 4; 
} bitset; 

También tengo int matriz, y quiero conseguir int valor de esta matriz, que representa el valor real de este campo de bits (que en realidad es una especie de palabra máquina que tengo las partes de ella, y quiero la representación int de la palabra completa).

Muchas gracias.

+3

@shaharg: Creo que no es muy preciso con su idioma. Los campos de bit son los campos individuales en su estructura, pero parece referirse a la estructura completa como un "campo de bit". – JXG

Respuesta

13

Se puede utilizar una unión:

typedef union bitsetConvertor { 
    bitset bs; 
    uint16_t i; 
} bitsetConvertor; 

bitsetConvertor convertor; 
convertor.i = myInt; 
bitset bs = convertor.bs; 

O puede usar un yeso:

bitset bs = *(bitset *)&myInt; 

O puede utilizar una estructura anónima dentro de una unión:

typedef union morder { 
    struct { 
     unsigned int targetRegister : 3; 
     unsigned int targetMethodOfAddressing : 3; 
     unsigned int originRegister : 3; 
     unsigned int originMethodOfAddressing : 3; 
     unsigned int oCode : 4; 
    }; 

    uint16_t intRepresentation; 
} bitset; 

bitset bs; 
bs.intRepresentation = myInt; 
+0

¿Cómo va a lograr esta unión anónima algo? – zubergu

+0

@zubergu, Conveniencia. No estrictamente necesario, por supuesto. – strager

+0

Desplazamiento hacia abajo: 'bitset bs = * (bitset *) &myInt;' es un ejemplo clásico de romper la * regla de alias estrictos *. – user694733

3

Seguro, solo use una unión. A continuación, puede acceder a sus datos como un int de 16 bits o como campos de bits individuales, p.

#include <stdio.h> 
#include <stdint.h> 

typedef struct { 
    unsigned int targetRegister : 3; 
    unsigned int targetMethodOfAddressing : 3; 
    unsigned int originRegister : 3; 
    unsigned int originMethodOfAddressing : 3; 
    unsigned int oCode : 4; 
} bitset; 

typedef union { 
    bitset b; 
    uint16_t i; 
} u_bitset; 

int main(void) 
{ 
    u_bitset u = {{0}}; 

    u.b.originRegister = 1; 
    printf("u.i = %#x\n", u.i); 

    return 0; 
} 
16

Por favor, por favor, haga no usa una unión. O mejor dicho, comprende lo que estás haciendo al usar una unión, preferiblemente antes de usar una.

Como puede ver en this answer, no confíe en bitfields para ser portátil. Específicamente para su caso, el orden de los campos de bit dentro de una estructura depende de la implementación.

Ahora, si su pregunta era, ¿cómo puede imprimir la estructura bitfield como un int, para una revisión privada ocasional, seguro, los sindicatos son geniales. Pero parece querer el "valor real" de sus bitfields.

Entonces, si solo trabaja en esta combinación de máquina/compilador, y no necesita , confíe en el valor matemático de int, siempre que tenga sentido, puede usar uniones. Pero si puede portar su código, o si necesita el "valor real" de la int, necesita escribir código de manipulación de bits para obtener los campos de bits en los bits int correctos.

+6

+1 'El ordenamiento de los campos de bit dentro de una estructura depende de la implementación' – Lazer

+0

¿Depende la implementación del compilador medio, es dependiente de la plataforma o ambos? – gsingh2011

+0

@ gsingh2011, ambos. Un compilador específico para una arquitectura específica puede hacer lo que considere mejor. – JXG