Що означає | = (одна труба рівна) та & = (одна амперса дорівнює)


116

У рядках нижче:

//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 #
Я хочу видалити системний атрибут із збереженням інших ...

Відповіді:


149

Вони складають операторів присвоєння , перекладаючи (дуже вільно)

x |= y;

в

x = x | y;

і те саме для &. У кількох випадках щодо неявного відтворення є трохи більше деталей, і цільова змінна оцінюється лише один раз, але це в основному суть її.

З точки зору нескладених операторів, &це побітове значення "І" і |є побітове "АБО" .

EDIT: У цьому випадку ви хочете 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-взявши його за допомогою маски, система встановить 0 і залишить усі інші біти неушкодженими, оскільки 0 & x = 0і 1 & x = xдля будь-якогоx


1
Що означає, що aоцінюється лише один раз? Чому його оцінювали б більше разів?
шовковий вогонь

@silkfire Це називається оцінка короткого замикання, см en.wikipedia.org/wiki/Short-circuit_evaluation
Поллукс

@Polluks Так в основному a |= bнасправді означає a = a || b?
шовковий вогонь

@silkfire Так, але не замінюйте одну трубу та дві труби.
Поллукс

3

Я хочу видалити системний атрибут із збереженням інших ..

Ви можете зробити це так:

Folder.Attributes ^= FileAttributes.System;

1
Я думаю, ви хочете використовувати для цього XOR замість AND.
GameZelda

трохи плутати / ~ потрібно чи ні
SilverLight

@LostLord Два способи є аналогічними, наскільки я знаю
Кріс S

@ChrisS ^= bitвстановить біт, якщо він ще не був встановлений, &= ~bitне встановлює його.
Хроніка

ви точно не хочете використовувати xor. Це поверне це, якби його не було.
Іоанн Лорд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.