Pergunta

Eu estava lendo sobre enumes de bandeira e operadores bitwise, e me deparei com este código:

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

Eu li em algum lugar sobre por que há uma inclusão ou afirmação e como não pode haver um &, mas não consigo encontrar o artigo. Alguém pode atualizar minha memória e explicar o raciocínio?

Além disso, como posso dizer e/ou? Por exemplo. Se DropDown1 = "Hello" e/ou DropDown2 = "Hello" ....

Obrigado

Foi útil?

Solução

Primeira pergunta:

UMA | faz um bit ou; Um pouco será definido no resultado se estiver definido no primeiro valor ou no segundo valor. (Você usa isso em enums Para criar valores que são combinações de outros valores) se você usar um bit -bit e, isso não faria muito sentido.

É usado da seguinte maneira:

[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)

Essencialmente, você pode testar se certos bits em um enum estão prontos; Nesse caso, estamos testando para ver se os bits correspondentes a um Read estão prontos. Valores Read e ReadWrite Ambos passariam neste teste (os dois têm um conjunto de bits zero); Write não teria (ele não possui um conjunto de bits zero).

// 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

Segunda questão:

Eu acho que quando você diz "e/ou", você quer dizer "um, o outro ou ambos". Isso é exatamente o que o || (ou operador) faz. Para dizer "um ou outro, mas não os dois", você usaria ^ (o exclusivo ou opertor).

Tabelas da verdade (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)

Outras dicas

O acima ou é um bit ou não um lógico ou. 1 | 2 é equivalente a 3 (enquanto 1 e 2 = 0).

Ver http://en.wikipedia.org/wiki/bitwise_operation Para uma melhor explicação sobre operações bitwise.

Tipos de enumeração. Observe os tipos de enumeração como sinalizadores de bits, ele fornece um exemplo ou um exemplo de A e não B.

Bem, existem duas perguntas diferentes aqui, mas para responder nº 2, o lógico ou como encontrado na maioria das linguagens de programação é o que você quer dizer com e/ou, eu acho.

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

Exclusivo-ou significa, no entanto, "um ou outro, mas não ambos".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top