2017-06-12 5 views
0

Un registre 32 bits, c'est-à-dire, status_reg a 1 champ (champ_1 < 0:31>). Pour définir et effacer ce registre, j'essaie d'obtenir la valeur de masque de ce registre. Donc, en général pour obtenir la valeur de masque la formule est:Recherche d'une valeur de masque avec la position supérieure et inférieure du registre

mask = ((~(~0 << (hbit-lbit+1))) << lbit) 

Dans ce HBIT est bit de position plus élevée à savoir 31. LBIT est peu position basse i.e.0. Je m'attends à ce que la valeur du masque soit 0xFFFFFFFF. Mais obtenir un masque = 0. Quelqu'un peut-il suggérer quel est le problème avec un masque?

J'utilise un système 32 bits.

+0

Si vous définissez 'hbit' à' 30' et 'lbit' à' 1' vous obtenez le résultat attendu de '0x7FFFFFFE'? – tilz0R

+4

Vous vous déplacez à gauche par 32, ne peut pas faire cela. De plus, à partir de la description, il ne semble pas qu'un masque soit nécessaire en premier lieu, 'status_reg' n'a qu'un seul champ et c'est le * entier int *, pour quoi masques-tu? – harold

+0

@harold est juste, vous n'avez pas besoin de masquer pour obtenir une valeur entière de registre – Toby

Répondre

0

Il affiche un comportement indéfini car vous vous retrouvez décalé en dehors de la plage de 32 bits.

1

Je pense que votre code ne vous donne pas le bon masque. Si vous aimez un masque pour les bits 6..10 vous pouvez utiliser (1<<(hbit-lbit+2))-1)<<lbit