Что означает побитовое или | оператор делать?

Я читал о перечислениях флагов и побитовых операторах и наткнулся на этот код:

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

Я где-то читал о том, почему есть оператор inclusive or и как не может быть &, но не могу найти статью. Может кто-нибудь освежить мою память и объяснить причину?

Кроме того, как я могу сказать и/или? Например. если dropdown1="hello" и/или dropdown2="hello"....

Спасибо


person GurdeepS    schedule 04.03.2009    source источник
comment
Я не могу решить ваш вопрос, как что-то может быть и и или ? конечно, это было бы просто или?   -  person Mez    schedule 04.03.2009
comment
@Martin - я предположил, что он имел в виду разговорную фразу и / или   -  person Dana    schedule 04.03.2009


Ответы (4)


Первый вопрос:

| выполняет побитовое или; бит будет установлен в результате, если он установлен в первом значении или во втором значении. (Вы используете его для enums для создания значений, которые являются комбинациями других значений). Если бы вы использовали побитовое и, это не имело бы особого смысла.

Он используется следующим образом:

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

По сути, вы можете проверить, установлены ли определенные биты в enum; в этом случае мы проверяем, установлены ли биты, соответствующие Read. Значения Read и ReadWrite оба пройдут этот тест (у обоих установлен нулевой бит); Write не будет (у него не установлен нулевой бит).

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

Второй вопрос:

Я думаю, когда вы говорите «и/или», вы имеете в виду «один, другой или оба». Это именно то, что делает || (или оператор). Чтобы сказать «одно или другое, но не оба», вы должны использовать ^ (эксклюзив или оператор).

Таблицы истинности (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)
person Daniel LeCheminant    schedule 04.03.2009

Вышеприведенное или является побитовым или, а не логическим или. 1 | 2 эквивалентно 3 (в то время как 1 и 2 = 0).

См. http://en.wikipedia.org/wiki/Bitwise_operation для лучшего объяснения побитового операции.

person kes    schedule 04.03.2009

Типы перечисления. Посмотрите раздел «Типы перечисления как битовые флаги», в нем приведен пример ИЛИ, а также пример И НЕ b.

person Ben S    schedule 04.03.2009

Что ж, здесь есть два разных вопроса, но, чтобы ответить на № 2, логическое ИЛИ, которое встречается в большинстве языков программирования, — это то, что вы подразумеваете под и/или, я думаю.

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

Однако исключающее ИЛИ означает «одно или другое, но не оба».

person Dana    schedule 04.03.2009