Question

Je lisais des informations sur les énumérations de drapeaux et les opérateurs de bits, et je suis tombé sur ce code:

enum file{
read = 1,
write = 2,
readandwrite = read | write
}

J'ai lu quelque part pourquoi il y a une déclaration ou un énoncé et comment il ne peut pas y avoir de & amp; mais je ne trouve pas l'article. Quelqu'un peut-il s'il vous plaît me rafraîchir la mémoire et expliquer le raisonnement?

Aussi, comment puis-je dire et / ou? Par exemple. si dropdown1 = " hello " et / ou dropdown2 = "bonjour" ....

Merci

Était-ce utile?

La solution

Première question:

Un | fait un bitwise ou; un bit sera défini dans le résultat s'il est défini dans la première ou la deuxième valeur. (Vous l'utilisez sur enums pour créer des valeurs qui sont des combinaisons d'autres valeurs). Si vous utilisiez un bitwise, cela n'aurait aucun sens.

Il s’utilise comme suit:

[Flags] 
enum FileAccess{
None = 0,                    // 00000000 Nothing is set
Read = 1,                    // 00000001 The read bit (bit 0) is set
Write = 2,                   // 00000010 The write bit (bit 1) is set
Execute = 4,                 // 00000100 The exec bit (bit 2) is set
// ...
ReadWrite = Read | Write     // 00000011 Both read and write (bits 0 and 1) are set
// badValue  = Read & Write  // 00000000 Nothing is set, doesn't make sense
ReadExecute = Read | Execute // 00000101 Both read and exec (bits 0 and 2) are set
}
// Note that the non-combined values are powers of two, \
// meaning each sets only a single bit

// ...

// Test to see if access includes Read privileges:
if((access & FileAccess.Read) == FileAccess.Read)

Pour l'essentiel, vous pouvez tester si certains bits d'un enum sont définis; dans ce cas, nous testons pour voir si les bits correspondant à un Read sont définis. Les valeurs Read et ReadWrite réussiraient ce test (les deux ont le bit zéro défini); Write ne le ferait pas (le bit zéro n'est pas défini).

// if access is FileAccess.Read
        access & FileAccess.Read == FileAccess.Read
//    00000001 &        00000001 => 00000001

// if access is FileAccess.ReadWrite
        access & FileAccess.Read == FileAccess.Read
//    00000011 &        00000001 => 00000001

// uf access is FileAccess.Write
        access & FileAccess.Read != FileAccess.Read
//    00000010 &        00000001 => 00000000

Deuxième question:

Je pense que lorsque vous dites "et / ou", vous voulez dire "l'un, l'autre ou les deux". C'est exactement ce que fait || (ou opérateur). Pour dire "l'un ou l'autre, mais pas les deux", vous utiliseriez ^ (l'exclusif ou l'opertor).

Tables de vérité (true == 1, false == 0):

     A   B | A || B 
     ------|-------
OR   0   0 |    0
     0   1 |    1 
     1   0 |    1
     1   1 |    1 (result is true if any are true)

     A   B | A ^ B 
     ------|-------
XOR  0   0 |    0
     0   1 |    1 
     1   0 |    1
     1   1 |    0  (if both are true, result is false)

Autres conseils

Ce qui précède ou est un bitwise ou, pas un ou logique. 1 | 2 équivaut à 3 (tandis que 1 & 2 = 0).

Voir http://en.wikipedia.org/wiki/Bitwise_operation pour une meilleure explication sur les opérations au niveau des bits.

Types d'énumération . Examinez la section Types d’énumération en tant qu’indicateurs binaires, elle donne un exemple de type OR ainsi que de type AND NOT b.

Eh bien, il y a deux questions différentes ici, mais pour répondre à la question 2, le OU logique que l'on trouve dans la plupart des langages de programmation est ce que vous entendez par et / ou, je pense.

if (dropdown == "1" || dropdown == "2") // Works if either condition is true.

Exclusive-OR signifie toutefois "l'un ou l'autre mais pas les deux".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top