Mise à jour incorrecte des champs de bits

J’essaie de résoudre une question. Ça dit,

Initialisez une nouvelle variable à la valeur 17512807u.

Supposons que nous numérotions les bits comme d’habitude, de 0 comme moins significatif (à droite) à 31 (le plus significatif, à gauche). Mettez à jour les bits 18 à 21 avec la valeur entière 8 et les bits 10 à 14 avec la valeur 17 (décimal). Imprimez la valeur résultante sous forme de nombre hexadécimal à huit chiffres pour afficher tous les chiffres.

Voici le code que je suis venu avec:

#include  int main(){ int value = 17512807u; int L = 21; // starting left position int R = 18; // starting right position int mask = (1 << (L - R + 1) - 1) << R; int newField = (8 << R) & mask; // integer value 8, shifting to right int newValue = value & (~mask); // remove range of bits value = newField | newValue; // update range of bits L = 14; R = 10; mask = (1 << (L - R + 1) - 1) << R; newField = (17 << R) & mask; newValue = value & (~mask); value = newField | newValue; printf("%08x\n", value); } 

La réponse que je reçois est 012b7d67

Cependant, on me dit que c’est la mauvaise réponse. Je ne sais pas quelle est la bonne réponse.

 int mask = ((1 << (L - R + 1)) - 1) << R; 

Vos expressions pour calculer le mask sont incorrectes. Vous avez changé les parenthèses dans la deuxième expression mais les deux sont incorrectes et ne comstacknt même pas:

 int mask = ((1 << (L - R + 1) - 1) << R; ... mask = ((1 << (L - R + 1) - 1 << R); 

devrait être écrit:

 mask = ((1UL << (L - R + 1)) - 1) << R; 

On dirait que ce qu’on vous demande de faire, c’est d’utiliser les champs de bits. Par exemple, étant donné le type

 struct bits{ int a:5; unsigned short b:3; unsigned char c:2; bool d:1; }; 

La struct ci struct dessus aura 4 membres, chacun d’une longueur de bit spécifique.

Si vous unissez cette structure avec un int vous obtenez une “double vue” des bits. Sous la forme d’une liste de champs ou d’un entier unique:

 union U{ struct bits fields; int i; }; 

Maintenant, le code comme

 U u; ui = 0; u.fields.b = true; 

devient valide et vous donne access au nombre entier ou aux champs de bits individuels.