Apa arti | = (pipa tunggal sama) dan & = (ampersand sama)

116

Di baris di bawah ini:

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

Apa arti |=(pipa tunggal sama) dan &=(ampersand sama) di C #
Saya ingin menghapus atribut sistem dengan menjaga yang lain ...

SilverLight
sumber

Jawaban:

150

Mereka adalah operator penugasan majemuk , menerjemahkan (sangat longgar)

x |= y;

ke

x = x | y;

dan sama untuk &. Ada sedikit lebih banyak detail dalam beberapa kasus mengenai pemeran implisit, dan variabel target hanya dievaluasi sekali, tapi pada dasarnya itulah intinya.

Dalam istilah operator non-gabungan, &merupakan "AND" dan |merupakan "OR" dengan bitwise .

EDIT: Dalam hal ini yang Anda inginkan Folder.Attributes &= ~FileAttributes.System. Untuk memahami mengapa:

  • ~FileAttributes.Systemberarti "semua atribut kecuali System " ( ~TIDAK bitwise)
  • & berarti "hasilnya adalah semua atribut yang terjadi di kedua sisi operan"

Jadi pada dasarnya ini bertindak sebagai topeng - hanya mempertahankan atribut yang muncul di ("semuanya kecuali Sistem"). Secara umum:

  • |=hanya akan menambahkan bit ke target
  • &=hanya akan menghapus bit dari target
Jon Skeet
sumber
2
x = x | (y);adalah cara yang lebih baik untuk menggambarkannya karena x |= y + z;tidak sama denganx = x | y + z;
IronMensan
terima kasih atas jawaban / tetapi untuk tujuan saya (menghapus atribut sistem) mana yang harus saya gunakan (| = atau & =)?
SilverLight
1
@LostLord:Folder.Attributes &= ~FileAttributes.System;
George Duckett
33

a |= bsama dengan a = a | bkecuali yang adievaluasi hanya sekali
a &= bsama dengan a = a & bkecuali yang adievaluasi hanya sekali

Untuk menghapus bit Sistem tanpa mengubah bit lain, gunakan

Folder.Attributes &= ~FileAttributes.System;

~adalah negasi bitwise. Dengan demikian Anda akan menyetel semua bit ke 1 kecuali bit Sistem. and-ing dengan mask akan mengatur Sistem ke 0 dan membiarkan semua bit lainnya utuh karena 0 & x = 0dan 1 & x = xuntuk apapunx

Armen Tsirunyan
sumber
1
Apa maksudnya yang ahanya dievaluasi sekali? Mengapa dievaluasi lebih dari itu?
Silkfire
@silkfire Ini disebut evaluasi sirkuit pendek, lihat en.wikipedia.org/wiki/Short-circuit_evaluation
Polluks
@Polluks Jadi pada dasarnya a |= bsebenarnya artinya a = a || b?
Silkfire
@silkfire Ya tapi jangan ganti satu pipa dan dua pipa.
Polluks
3

Saya ingin menghapus atribut sistem dengan mempertahankan yang lain ..

Anda dapat melakukan ini seperti ini:

Folder.Attributes ^= FileAttributes.System;
Chris S
sumber
1
Saya pikir Anda ingin menggunakan XOR, bukan DAN untuk ini.
GameZelda
sedikit bingung / ~ perlu atau tidak
SilverLight
@LostLord Kedua metode analog sejauh yang saya tahu
Chris S
@ChrisS ^= bitakan menyetel bit jika belum disetel, &= ~bittidak menyetelnya.
Tawarikh
Anda pasti tidak ingin menggunakan xor. Itu akan mengembalikannya jika hilang.
John Lord