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;
6 Réponses :
Cela pourrait aider à y penser de cette façon (valeurs indiquées en binaire): donc ... p> 1001 est Est-ce que cela aident-t-il du tout? La notation est la syntaxe pour définir uniquement ces 2 bits. P> < / p> transaddr_enable code > et msginfo_enable code>
ou de
1101 appartient tout mais fastStart_coders_in_offert code> p> | code> est syntaxe pour définir le bit correct: p>
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
}
Votre variable, 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: p> 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. P> Alors, quand vous voyez: P > ce que vous dites est "Prendre la valeur de msginfo_mask code>, 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. msginfo_mask code> 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." p> p>
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> 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;
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.
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: p> 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. P> 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é. p> p>
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: 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)
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.