Первый вопрос:
|
выполняет побитовое или; бит будет установлен в результате, если он установлен в первом значении или во втором значении. (Вы используете его для 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