Conversion du champ de bits en int

J’ai bit field déclaré de cette façon:

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

J’ai aussi int tableau, et je veux obtenir la valeur int de ce tableau, qui représente la valeur réelle de ce champ de bits (qui est en fait une sorte de mot machine que j’ai les parties, et je veux la représentation int de le mot entier).

Merci beaucoup.

Vous pouvez utiliser un syndicat:

 typedef union bitsetConvertor { bitset bs; uint16_t i; } bitsetConvertor; bitsetConvertor convertor; convertor.i = myInt; bitset bs = convertor.bs; 

Ou vous pouvez utiliser un casting:

 bitset bs = *(bitset *)&myInt; 

Ou vous pouvez utiliser une structure anonyme dans une union:

 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; 

S’il vous plaît, s’il vous plaît, n’utilisez pas un syndicat. Ou plutôt, comprenez ce que vous faites en utilisant un syndicat – de préférence avant de l’utiliser.

Comme vous pouvez le constater dans cette réponse , ne vous fiez pas aux champs de bits pour être portables. Dans votre cas en particulier, l’ordre des champs de bits dans une structure dépend de la mise en oeuvre.

Maintenant, si votre question était, comment pouvez-vous imprimer la structure de bitfield comme un int, pour un examen privé occasionnel, bien sûr, les syndicats sont excellents. Mais vous semblez vouloir la “valeur réelle” de vos champs de bits.

Donc, si vous ne travaillez que sur cette combinaison machine / compilateur et que vous n’avez pas besoin de vous fier à la valeur mathématique de int, vous pouvez utiliser des unions tant que cela a du sens. Mais si vous pouvez transférer votre code, ou si vous avez besoin de la “valeur réelle” de l’int, vous devez écrire du code de manipulation de bits pour obtenir les champs de bits dans les bons bits d’int.

Bien sûr, utilisez simplement un syndicat. Vous pouvez ensuite accéder à vos données sous forme de 16 bits int ou de champs de bits individuels, par exemple:

 #include  #include  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}}; uboriginRegister = 1; printf("ui = %#x\n", ui); return 0; }