Что делает побитовое или | оператор делает? - PullRequest
1 голос
/ 04 марта 2009

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

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

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

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

Спасибо

Ответы [ 4 ]

14 голосов
/ 04 марта 2009

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

A | делает поразрядно или; бит будет установлен в результате, если он установлен в первом или втором значении. (Вы используете его в 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)
2 голосов
/ 04 марта 2009

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

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

1 голос
/ 04 марта 2009

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

0 голосов
/ 04 марта 2009

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

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

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

...