Вопрос

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

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

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

Кроме того, как я могу сказать и / или?Например.если выпадающее меню 1= "привет" и / или выпадающее меню 2= "привет"....

Спасибо

Это было полезно?

Решение

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

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)

Другие советы

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

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

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

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

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

Эксклюзивный -ИЛИ, однако, означает "Один или другой, но не оба".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top