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

118

В строках ниже:

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

SilverLight
источник

Ответы:

151

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

x |= y;

в

x = x | y;

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

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

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

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

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

  • |=будет только добавлять биты к цели
  • &=удалит только биты из цели
Джон Скит
источник
2
x = x | (y);это лучший способ описать это, потому что x |= y + z;это не то же самое, чтоx = x | y + z;
IronMensan
спасибо за ответы / но для моей цели (удаление системного атрибута) какой из них я должен использовать (| = или & =)?
SilverLight
1
@LostLord:Folder.Attributes &= ~FileAttributes.System;
Джордж Дакетт
33

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

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

Folder.Attributes &= ~FileAttributes.System;

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

Армен Цирунян
источник
1
Что означает, что aоценивается только один раз? Почему это будет оцениваться больше раз?
silkfire
@silkfire Это называется оценкой короткого замыкания, см. en.wikipedia.org/wiki/Short-circuit_evaluation
Polluks
@Polluks Так в основном a |= bзначит a = a || b?
silkfire
@silkfire Ага, но не меняйте местами одну трубу и две трубы.
Polluks
3

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

Сделать это можно так:

Folder.Attributes ^= FileAttributes.System;
Крис С
источник
1
Я думаю, вы хотите использовать для этого XOR вместо AND.
GameZelda
немного запутался / ~ нужно или нет
SilverLight
@LostLord Насколько мне известно, эти два метода аналогичны
Chris S
@ChrisS ^= bitустановит бит, если он еще не был установлен, &= ~bitне устанавливает его.
Хроника,
вы определенно не хотите использовать xor. Это вернуло бы его, если бы его не было.
Джон Лорд