Co oznacza | = (pojedyncza kreska równa) i & = (pojedynczy znak ampers i równy) oznaczają

116

W poniższych wierszach:

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

Co oznacza |=(pojedyncza rura równa) i &=(pojedynczy znak ampersand równa) w języku C #
Chcę usunąć atrybut systemowy, zachowując pozostałe ...

SilverLight
źródło

Odpowiedzi:

150

Są to operatory przypisania złożonego , tłumaczące (bardzo luźno)

x |= y;

w

x = x | y;

i to samo dla &. W kilku przypadkach jest nieco więcej szczegółów dotyczących niejawnego rzutowania, a zmienna docelowa jest oceniana tylko raz, ale w zasadzie to jest sedno tego.

Pod względem operatorów &niezłożonych jest bitowym „AND” i |bitowym „OR” .

EDYCJA: W tym przypadku chcesz Folder.Attributes &= ~FileAttributes.System. Aby zrozumieć, dlaczego:

  • ~FileAttributes.Systemoznacza „wszystkie atrybuty oprócz System ” ( ~jest bitowym NIE)
  • & oznacza "wynik to wszystkie atrybuty, które występują po obu stronach operandu"

Więc zasadniczo działa jak maska ​​- zachowuje tylko te atrybuty, które pojawiają się w („wszystko oprócz Systemu”). Ogólnie:

  • |=będzie zawsze tylko dodać bity do celu
  • &=będzie zawsze tylko usunąć bity od celu
Jon Skeet
źródło
2
x = x | (y);jest lepszym sposobem opisania tego, ponieważ x |= y + z;nie jest tym samym, cox = x | y + z;
IronMensan,
dzięki za odpowiedzi / ale w moim celu (usunięcie atrybutu systemowego) którego powinienem użyć (| = lub & =)?
SilverLight
1
@LostLord:Folder.Attributes &= ~FileAttributes.System;
George Duckett
33

a |= bjest równoważne z a = a | bwyjątkiem tego, że ajest oceniane tylko raz,
a &= bjest równoważne z a = a & bwyjątkiem tego, że ajest oceniane tylko raz

Aby usunąć bit systemowy bez zmiany innych bitów, użyj

Folder.Attributes &= ~FileAttributes.System;

~jest negacją bitową. W ten sposób ustawisz wszystkie bity na 1 oprócz bitu systemowego. and- użycie maski ustawi System na 0 i pozostawi wszystkie inne bity nietknięte, ponieważ 0 & x = 0i 1 & x = xdla każdegox

Armen Tsirunyan
źródło
1
Co to znaczy, że ajest oceniany tylko raz? Dlaczego miałoby być oceniane więcej razy niż to?
Silkfire
@silkfire To się nazywa ocena zwarcia, patrz en.wikipedia.org/wiki/Short-circuit_evaluation
Polluks
@Polluks Więc w zasadzie a |= bfaktycznie oznacza a = a || b?
Silkfire
@silkfire Tak, ale nie zamieniaj jednej rury i dwóch rur.
Polluks
3

Chcę usunąć atrybut systemowy, zachowując pozostałe.

Możesz to zrobić w następujący sposób:

Folder.Attributes ^= FileAttributes.System;
Chris S.
źródło
1
Myślę, że do tego chcesz użyć XOR zamiast AND.
GameZelda
trochę zdezorientowany / ~ jest konieczny lub nie
SilverLight
@LostLord Te dwie metody są analogiczne, o ile mi wiadomo
Chris S
@ChrisS ^= bitustawi bit, jeśli nie był jeszcze ustawiony, &= ~bitnie ustawia go.
Kronika
zdecydowanie nie chcesz używać xor. To by go cofnęło, gdyby zniknęło.
John Lord