Что означает | = (одинарная труба равна) и & = (одинарный амперсанд равен) - PullRequest
92 голосов
/ 04 августа 2011

В следующих строках:

//Folder.Attributes = FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;
Folder.Attributes |= FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;


Folder.Attributes |= ~FileAttributes.System;
Folder.Attributes &= ~FileAttributes.System;

Что означает |= (одинарная труба равна) и &= (одинарный амперсанд равен) означает в C #
Я хочу удалить системный атрибут, оставив остальные ...

Ответы [ 3 ]

127 голосов
/ 04 августа 2011

Они составные присваивания операторы, переводящие (очень свободно)

x |= y;

в

x = x | y;

и то же самое для &. В некоторых случаях есть немного больше подробностей относительно неявного приведения, и целевая переменная оценивается только один раз, но в этом суть.

В терминах несоставных операторов & является побитовым «И» , а | является побитовым «ИЛИ» .

РЕДАКТИРОВАТЬ: В этом случае вы хотите Folder.Attributes &= ~FileAttributes.System. Чтобы понять почему:

  • ~FileAttributes.System означает «все атрибуты , кроме System» (~ поразрядно-НЕ)
  • & означает «результатом являются все атрибуты, которые встречаются с обеих сторон операнда»

Таким образом, он в основном действует как маска - only сохраняет те атрибуты, которые появляются в («все, кроме System»). В целом:

  • |= только когда-либо добавит битов к цели
  • &= только когда-либо удалит битов из цели
31 голосов
/ 04 августа 2011

a |= b эквивалентнодо a = a | b за исключением того, что a оценивается только один раз
a &= b эквивалентно a = a & b, за исключением того, что a оценивается только один раз

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

Folder.Attributes &= ~FileAttributes.System;

~ - битовое отрицание.Таким образом, вы установите все биты в 1, кроме системного бита.and -ing с маской установит Систему в 0 и оставит все остальные биты нетронутыми, потому что 0 & x = 0 и 1 & x = x для любого x

3 голосов
/ 04 августа 2011

Я хочу удалить системный атрибут, оставив остальные ..

Вы можете сделать это так:

Folder.Attributes ^= FileAttributes.System;
...