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 ...

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

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


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;

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.