11
votes

Comment fonctionne le masquage

Je suis nouveau chez C, et je débogage avec code source. Cependant, je suis confondu avec cet extrait de code.

Lorsque les valeurs sont attribuées à la valeur de la structure, je pense que c'est un peu de masquage. Mais pas sûr, et s'il s'agit de masquage. Comment masquage fonctionne-t-il dans ce concept? P>

Merci beaucoup, P>

#define MSGINFO_ENABLE                   0x01
#define MIME_ENABLE                      0x02
#define FASTSTART_CODERS_IN_OFFERED      0x04
#define TRANSADDR_ENABLE                 0x08

typedef struct {

    unsigned int    msginfo_mask;     /* added in version 0x0101               */

} VIRTBOARD; 


VIRTBOARD       VirtBoard;

/* Not sure I understand what is happening here. */
VirtBoard.msginfo_mask  = MSGINFO_ENABLE | MIME_ENABLE | FASTSTART_CODERS_IN_OFFERED | TRANSADDR_ENABLE;

c c++

1 commentaires

Le | pourrait aussi être un + dans ce cas si cela aide à comprendre cela, mais uniquement parce que les bits ne se chevauchent pas. La réponse est "15" de chaque sens.


6 Réponses :


7
votes

Cela pourrait aider à y penser de cette façon (valeurs indiquées en binaire): xxx

donc ...

1001 est transaddr_enable et msginfo_enable
ou de
1101 appartient tout mais fastStart_coders_in_offert

Est-ce que cela aident-t-il du tout? La notation | est syntaxe pour définir le bit correct: xxx

est la syntaxe pour définir uniquement ces 2 bits. < / p>


0 commentaires

2
votes

Le programmeur réglait le masque sur une certaine valeur du bit. Dans ce cas:

if((newMsg & VitBoard.msginfo_mask) == 0x07)
{
  //do something related to mime enable, msginfo enable and faststart
}


0 commentaires

4
votes

Votre variable, msginfo_mask , lorsque représenté sous forme de numéro binaire (1 et 0's et 0) est utilisé comme "masque" en définissant certains bits à 1 (à l'aide d'un bit-sage ou) ou d'effacer certains bits à 0 (en utilisant un bit-sage et). Votre code de code définit certains bits à 1 tout en laissant d'autres inchangés. Le masquage est comparable à la manière dont un peintre masque les zones qu'ils ne veulent pas être peints.

Si vous regardez les #defines en haut de votre code, vous remarquerez que chaque numéro représente un seul bit lorsqu'il est écrit en binaire: xxx

est fait en utilisant la fonction ou la fonction. Si vous ou un peu avec 1, le résultat sera toujours un 1. Si vous ou un peu avec 0, la valeur d'origine ne sera pas modifiée.

Alors, quand vous voyez: xxx

ce que vous dites est "Prendre la valeur de msginfo_mask et ou avec (binaire) 0001, 0010, 0100 et 1000. C'est le même chose comme disant "ensemble bit 0, bit 1, bit 2 et bit 3."


0 commentaires

16
votes

OK en anglais clair:

Les chiffres hexdécimaux 0x01,0x02,0x04,0x08 ont été sélectionnés chacun car ils sont codés chacun en tant que différents bits étant définis en binaire. Aucune des cartes de bits se chevauche, chacune peut être lue et définie sans être effectuée par les autres bits. Ajout des commentaires suivants à votre code rend plus claire ce qui se passe: p> xxx pré>

Ajout d'un commentaire avant l'autre ligne indique le résultat: p>

// VirtBoard.msginfo_mask |= 0001 
// VirtBoard.msginfo_mask |= 0010 
// VirtBoard.msginfo_mask |= 0100 
// VirtBoard.msginfo_mask |= 1000
//                           ----
// VirtBoard.msginfo_mask == 1111
VirtBoard.msginfo_mask = MSGINFO_ENABLE              |
                         MIME_ENABLE                 |
                         FASTSTART_CODERS_IN_OFFERED |
                         TRANSADDR_ENABLE;


4 commentaires

Bonjour, je comprends un peu mieux après avoir lu toutes les autres réponses. À l'aide d'un masque dans ce cas, c'est comme régler les variables ou msginfo_enable, mine_enable, etc. Alors, vous les permettez de tous que vous leur permettez tous d'être vrai. Donc, par exemple, si je voulais juste avoir transaddr_enable activé, j'aurais juste fait ceci: virtboard.msginfo_mask = transaddr_enable; Ce qui serait égal à 8. Cependant, cela serait-il identique si je devais avoir toutes ces variables globales et les définir tout en vrais ou faux, en fonction desquels je voulais être activé ou non?


L'utilisation de bitmaps vous permet de les emballer tout en un seul mot ou dans ce cas un nybble. Si vous avez du matériel ou un autre logiciel qui les attendez dans un bitmap, les séparer en plusieurs variables sera incompatible. Si vous contrôlez les deux côtés du code, vous pourriez en faire des globaux, mais les globaux de manière générale sont généralement évités en faveur des références transparentes aux structures.


Robuk: Chaque bit est comme un commutateur. En ing de valeurs multiples ensemble, vous obtenez un masque qui détermine les commutateurs obtenus, et vous pouvez les écrire dans une action. Si vous avez 32 de ces commutateurs, vous devrez peut-être avoir besoin de 4 milliards de globaux pour couvrir chaque combinaison possible, tandis que vous n'avez besoin que de masques 32 bits pour adresser chaque bit individuellement.


Vous n'auriez jamais besoin de 4 milliards de globaux, chaque variable globale serait une bool qui pourrait être activée ou désactivée, vous auriez besoin d'au plus 32 globaux.



2
votes

L'autre partie est que "ou" les masques sont probablement utilisés comme commutateurs pour activer / désactiver certaines fonctionnalités. Dans les exemples, vous avez écrit, on dirait peut-être une sortie à différents niveaux ou parties des codes.

Les masques définis peuvent être utilisés pour vérifier la fonctionnalité pour voir si elle est activée ou désactivée. Par exemple: xxx

dans le premier si, puisque msginfo_Enabled Mask était "ou" et attribué à la variable, lorsque vous appliquez une opération "et" de fonctionnement avec la variable et le masque msgginof_enabled , une valeur non nulle est renvoyée, indiquant qu'il est vrai. Donc l'instruction Printf sera exécutée.

dans le cas du second si, puisque transaddr_enable n'était pas "ni" dans la variable, lorsqu'un "et" est utilisé avec le masque variable et transaddr_enable, il retournera une valeur zéro, donc aucun message ne sera imprimé.


0 commentaires

3
votes

L'opérateur binaire '|' est l'opérateur ou l'opérateur; Pour chaque bit dans les deux mots d'entrée, si le bit est un 1, le bit correspondant dans le résultat est un 1: xxx pré>

le '|' L'opérateur est généralement utilisé pour définir des bits individuels dans un mot, par exemple dans l'extrait de code que vous avez affiché. p>

L'opérateur binaire '&' est l'opérateur et l'opérateur; Pour chaque bit dans les deux mots d'entrée, si les deux bits sont 1, le bit correspondant dans le résultat est un 1: p>

VirtBoard.msginfo_mask &= ~(MSGINFO_ENABLE | TRANSADDER_ENABLE)


0 commentaires