2011-08-04 44 views
75

在下面幾行:什麼呢| =(單管等)和=(單個號相同)的意思是

//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#中的意思
我想刪除系統屬性以保持其他...

+0

我試圖讓我自己的虛擬版本(我屬於這個組)在http://www.shrinkrays.net/articles/csharp-bit-manipulation-通過-example.aspx。 〜是NOT或FileAttributes.System的反轉 –

+0

@Chris S:感謝您的鏈接/ nice – MoonLight

回答

103

他們compound assignment運營,翻譯(非常鬆散)

x |= y; 

x = x | y; 

與同爲&。在一些關於隱式轉換的案例中有更多的細節,目標變量只被評估一次,但這基本上是它的要點。

在非複合運營商方面,& is a bitwise "AND"| is a bitwise "OR"

編輯:在這種情況下,你想要Folder.Attributes &= ~FileAttributes.System。要理解爲什麼:

  • ~FileAttributes.System意味着「所有的屬性,除了System」(~是按位NOT)
  • &表示「結果是所有操作數的兩邊發生屬性」

所以它基本上是作爲一個掩碼 - 只有保留那些出現在(「除系統之外的所有內容」)的屬性。一般來說:

  • |=將只添加位目標
  • &=將只從目標中刪除
+1

'x = x | (y);'是一種更好的描述方法,因爲'x | = y + z;'與'x = x | y + z;' – IronMensan

+0

謝謝你的答案/但爲了我的目的(刪除系統屬性)我應該使用哪一個(| =或者=)? – MoonLight

+1

@LostLord:'Folder.Attributes&=〜FileAttributes.System;' –

27

a |= b相當於a = a | b除了a只計算一次
a &= b相當於a = a & b除了a僅一次

評價爲了去除系統位,而不改變其它位,使用

Folder.Attributes &= ~FileAttributes.System; 

~是按位否定。因此您將設置所有位爲1,除了系統位。and與面具將系統設置爲0,並將所有其他位不變-ing,因爲0 & x = 01 & x = x任何x

3

我想刪除系統屬性以保持其他..

你可以這樣做:

Folder.Attributes ^= FileAttributes.System; 
+1

我想你想使用XOR而不是AND來做到這一點。 – GameZelda

+0

有點困惑/〜是否必要 – MoonLight

+0

@LostLord:這當然是!看到我的答案解釋 –