11
votes

Qu'est-ce que cette déclaration signifie en C #?

Qu'est-ce que si ((a & b) == b) code> signifie dans le bloc de code suivant?

if (e.Modifiers == Keys.Shift)
{
    lbl.Text += "\n" + "Shift was held down.";
}


2 commentaires

Google bitwise et , puis google drapeau bit .


duplicata de Qu'est-ce qu'un seul | ou & moyen?


8 Réponses :


3
votes

Un seul ampersand (&) est un peu et ajoute essentiellement les valeurs de (A & B), puis testez l'égalité dans (A & B) == B

Donc, dans votre exemple, il s'agit essentiellement si la touche Maj enfoncée (n'importe quelle touche + SHIFT) == Maj.


2 commentaires

Ça ne les ajoute pas! Il y a une différence énorme entre appliquer le bit et l'opérateur et l'ajout.


Oui, je le réalise. J'essayais juste de l'expliquer de manière simple. Désolé d'offenser.



5
votes

C'est la logique booléenne (& = "Bitwise et"). Vous vérifiez si la variable contient une valeur. C'est comme un filtre.

Exemple: xxx

dans votre code xxx

tandis que les touches de contrôle.Shift est contenue dans E.Modificateurs.


0 commentaires

4
votes

Un seul ampersand fait référence au Bitwise et opérateur . Lorsqu'il est utilisé conjointement avec un énumé qui comporte l'attribut [indicateurs] sur celui-ci, que les touches Enum font, il est utilisé comme vous l'avez montré pour déterminer si l'un des bits de cet énumé est défini ou non.

Il pourrait y avoir plus d'une touche de modificateur enfoncée simultanément, c'est pourquoi il est utilisé à la place d'une comparaison directe.

Vous pouvez en savoir plus sur Enum Flags ici . Faites défiler jusqu'à la sous-section intitulée «Types de dénombrement comme drapeaux de bits». Vous verrez un échantillon assez similaire à celui-ci.


0 commentaires

3
votes

Il utilise une opération bitwise pour interroger si un "drapeau" (bit) est réglé (égal à 1).

Probablement mieux à lire sur les opérations ENUMS et BITWise à http: / /msdn.microsoft.com/en-us/library/vstudio/cc138362.aspx


0 commentaires

3
votes

& est le bit et opérateur. Ce qu'il fait est clés est un drapeau énum, ​​les valeurs dans clés peuvent être une combinaison des bits de plusieurs valeurs. Donc, pour tester une valeur particulière que vous avez d'abord et votre valeur avec la valeur que vous souhaitez tester puis le comparer à la valeur que vous souhaitez tester.

Par exemple, vous pourriez avoir les deux le quart de travail et la clé CTRL retenue, de sorte que la valeur dans E.MOdifier sera une combinaison des bits de .Shift et keys.ctrl . Donc, ceci: xxx

est faux. Le changement est maintenu en panne, mais Ctrl est également maintenu. Si vous voulez savoir si Maj enfoncé est maintenu, quelles que soient les autres clés pourraient être maintenues, vous devez d'abord filtrer toutes les autres clés. Cela se fait facilement en utilisant keys.shift sous forme de filtre: xxx

ceci sera maintenant vrai si la touche Maj enfoncée sera effacée Indépendamment de ce que d'autres clés pourraient être appuyées sur et de faux sinon.


0 commentaires

3
votes

partie 1

C'est la logique et l'opérateur.

Il est utilisé lorsque plusieurs drapeaux doivent être réglés dans un exemple entier:

a par exemple est 3 qui signifie 00000011 en notation binaire. b Par exemple est 2 qui signifie 00000010 en notation binaire.

Lorsque vous souhaitez vérifier si A a le drapeau (le second bit de droite) que B représente vous pouvez utiliser l'opérateur et l'opérateur:

A & B = 00000010

et quand cela équivaut à B (ou est> 0), vous savez que le drapeau est défini.

partie 2

L'opérateur égal peut également être utilisé pour le cas que vous souhaitez vérifier si "Keys.shift" est la seule touche "Modificateur" et qu'aucun autre n'est appuyé. Lorsque vous utilisez le premier code, d'autres touches "modifier" peuvent être appuyées également et si la condition si elle sera toujours vraie.


0 commentaires

3
votes

Un seul ampersand (&) effectue un bit-sage et une opération; Un double ampersand (&&) effectue une boolean et une opération.

Un bit-sage et effectue une opération et une opération sur chaque bit des deux arguments (par conséquent, il est appelé "bit-wise"). Ainsi, la sortie d'un bit-sage et d'une opération (ou d'une opération de bit-wise) ne sera pas une valeur booléenne. Voici quelques exemples de bit-sage et d'opérations: xxx

un booléen et fonctionne sur deux valeurs booléennes et retourne un booléen: xxx

court-circuit court
Un booléen et une opération (&&) peut également être effectué sur deux expressions qui renvoient une valeur booléenne: xxx

parce que la première expression (A <3) Évalue à FALSE , le résultat ne peut pas être true car les deux expressions doivent être évaluées à true pour le résultat d'être vrai . Pour cette raison, la deuxième expression ne sera même pas évaluée. Ceci s'appelle "court-circuit". Cependant, avec un bit-sage et une opération, les deux expressions doivent être évaluées avant que l'opération soit effectuée. Ainsi, dans la majorité des situations où vous voulez juste déterminer si deux choses sont vraies (Boolean), le booléen et (&&) sera la meilleure option.

Dans votre exemple, le code comparait des bits individuels dans E.MOFIERS avec des bits individuels dans Keys.shift . Aucun argument ne représente une valeur booléenne et donc l'opération est bit-sage (&) plutôt que boolean (&&).


0 commentaires