web-dev-qa-db-ja.com

| =(単一パイプが等しい)および&=(単一アンパサンドが等しい)の意味

以下の行で:

//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#の平均
他を保持したままシステム属性を削除したい...

93
SilverLight

それらは 複合代入 演算子であり、翻訳(非常に大雑把に)

x |= y;

x = x | y;

&についても同じです。暗黙的なキャストに関するいくつかのケースではもう少し詳細があり、ターゲット変数は一度だけ評価されますが、それは基本的にその要点です。

非複合演算子に関しては、 &はビット単位の「AND」 であり、 |はビット単位の「OR 「

編集:この場合、Folder.Attributes &= ~FileAttributes.Systemが必要です。理由を理解するには:

  • ~FileAttributes.Systemは、「すべての属性exceptSystem」(~はビット単位のNOT)を意味します
  • &は、「結果はオペランドの両側にあるすべての属性である」ことを意味します

したがって、基本的にはマスクとして機能します-onlyに現れる属性を保持します(「Systemを除くすべて」)。一般に:

  • |=は、ターゲットにaddビットのみを追加します
  • &=は、ターゲットからremoveビットのみです
129
Jon Skeet

a |= bは、aが1回だけ評価されることを除いて、a = a | bと同等です。
a &= bは、aが1回だけ評価されることを除いて、a = a & bと同等です。

他のビットを変更せずにシステムビットを削除するには、使用します

Folder.Attributes &= ~FileAttributes.System;

~はビットごとの否定です。したがって、システムビットを除くすべてのビットを1に設定します。 and-マスクを使用すると、Systemが0に設定され、0 & x = 0および1 & x = xxであるため、他のすべてのビットはそのままになります。

31
Armen Tsirunyan

他を保持したままシステム属性を削除したい。

次のようにこれを行うことができます:

Folder.Attributes ^= FileAttributes.System;
3
Chris S