Побитовое вычитание - PullRequest
       6

Побитовое вычитание

9 голосов
/ 23 сентября 2011

Учитывая перечисление:

[Flags]
enum foo
{
a = 1,
b = 2,
c = 4
}

тогда

foo example = a | b;

Если я не знаю, содержит ли foo c, ранее я писал следующее

if (example & foo.c == foo.c)
    example  = example ^ foo.c;

Есть ли способ сделать это, не проверяя наличие foo.c в example?

Как и в случае с дополнениями, я могу просто сделать OR, и если значение перечисления уже существует в example, тогда это не имеет значения.

Ответы [ 2 ]

22 голосов
/ 23 сентября 2011

Я думаю, что вы хотите:

example &= ~foo.c;

Другими словами, выполняйте побитовую маску "И" с каждым установленным битом , за исключением единицы для c.

РЕДАКТИРОВАТЬ: Я должен добавить "кроме" к Неограниченная мелодия в какой-то момент, чтобы вы могли написать:

example = example.Except(foo.c);

Дайте мне знать, если это будет вас интересовать,и я посмотрю, что я могу сделать на выходных ...

8 голосов
/ 23 сентября 2011

И это с дополнением foo.c:

example = example & ~foo.c
...