Cosa significano | = (tubo singolo uguale) e & = (singola e commerciale uguale)


116

Nelle righe seguenti:

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

Cosa significa |=(single pipe uguale) e &=(single e commerciale uguale) in C #
Voglio rimuovere l'attributo di sistema mantenendo gli altri ...

Risposte:


150

Sono operatori di assegnazione composta , che traducono (molto liberamente)

x |= y;

in

x = x | y;

e lo stesso per &. Ci sono un po 'più di dettagli in alcuni casi riguardo a un cast implicito e la variabile target viene valutata solo una volta, ma questo è fondamentalmente il succo.

In termini di operatori non composti, &è un "AND" |bit per bit ed è un "OR" bit per bit .

EDIT: In questo caso vuoi Folder.Attributes &= ~FileAttributes.System. Per capire perché:

  • ~FileAttributes.Systemsignifica "tutti gli attributi tranne System " ( ~è un bit per bit NOT)
  • & significa "il risultato sono tutti gli attributi che si trovano su entrambi i lati dell'operando"

Quindi fondamentalmente agisce come una maschera: conserva solo gli attributi che appaiono in ("tutto tranne il sistema"). In generale:

  • |=aggiungerà sempre e solo bit all'obiettivo
  • &=rimuoverà sempre e solo i bit dalla destinazione

2
x = x | (y);è un modo migliore per descriverlo perché x |= y + z;non è la stessa dix = x | y + z;
IronMensan

grazie per le risposte / ma per il mio scopo (rimozione dell'attributo di sistema) quale dovrei usare (| = o & =)?
SilverLight

1
@LostLord:Folder.Attributes &= ~FileAttributes.System;
George Duckett

33

a |= bè equivalente a a = a | btranne che aviene valutato solo una volta
a &= bè equivalente a a = a & btranne che aviene valutato solo una volta

Per rimuovere il bit di sistema senza modificare altri bit, utilizzare

Folder.Attributes &= ~FileAttributes.System;

~è una negazione bit per bit. Quindi imposterai tutti i bit a 1 tranne il bit di sistema. and- selezionandolo con la maschera si imposterà System a 0 e lascerà intatti tutti gli altri bit perché 0 & x = 0e 1 & x = xper qualsiasix


1
Cosa significa che aviene valutato una sola volta? Perché dovrebbe essere valutato più volte di così?
silkfire

@silkfire Questa è chiamata valutazione di cortocircuito, vedere en.wikipedia.org/wiki/Short-circuit_evaluation
Polluks

@ Polluks Quindi in pratica a |= bsignifica in realtà a = a || b?
silkfire

@silkfire Sì, ma non scambiare un tubo e due tubi.
Polluks

3

Voglio rimuovere l'attributo di sistema mantenendo gli altri ..

Puoi farlo in questo modo:

Folder.Attributes ^= FileAttributes.System;

1
Penso che tu voglia usare uno XOR invece di un AND per questo.
GameZelda

un po 'confuso / ~ è necessario o no
SilverLight

@LostLord I due metodi sono analoghi per quanto ne so
Chris S

@ChrisS ^= bitimposterà il bit se non era già impostato, &= ~bitnon lo imposta.
Cronaca

sicuramente non vuoi usare un xor. Questo lo rimetterebbe a posto se fosse sparito.
John Lord
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.