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

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

//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 #
Я хочу удалить системный атрибут с сохранением других …

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

 x |= y; 

в

 x = x | y; 

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

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

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

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

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

  • |= будет только добавлять биты к цели
  • &= будет удалять биты только с целевой
  • | побитовое или
  • & побитовое и

a |= b эквивалентно a = 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

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

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

 Folder.Attributes ^= FileAttributes.System; 
  • Сделать оператор << виртуальным?
  • Java: Что делает оператор двоеточия (:)?
  • Разница между & и &&
  • Почему компиляторы C ++ не определяют operator == и operator! =?
  • Вставить vs emplace vs operator в c ++ map
  • Невозможно ли применить оператор == к родовым типам в C #?
  • Разница между ++ Var и Var ++
  • Есть ли разница в производительности между ++ i и i ++ в C #?
  • Каковы операторы Pointer-to-Member -> * и. * В C ++?
  • В чем разница между «или» и «|» при программировании в xslt?
  • Есть ли условный тернарный оператор в VB.NET?
  • Давайте будем гением компьютера.