Что означает | = (одинарная труба равна) и & = (одинарная амперсанда равна)

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

//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;

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

Ответ 1

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

x |= y;

в

x = x | y;

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

В терминах не-составных операторов & является поразрядным "AND" и | - побитовое "ИЛИ" .

EDIT: в этом случае вы хотите Folder.Attributes &= ~FileAttributes.System. Чтобы понять, почему:

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

Поэтому он в основном действует как маска - сохраняет только те атрибуты, которые появляются ( "все, кроме системы" ). В общем:

  • |= будет только добавлять биты к цели
  • &= будет удалять только биты из целевого объекта

Ответ 2

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

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

Folder.Attributes &= ~FileAttributes.System;

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

Ответ 3

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

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

Folder.Attributes ^= FileAttributes.System;