Первый вопрос:
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)