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


116

以下の行で:

//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#
、私は他の人を維持しながら、システム属性を削除したいの...

回答:


149

これらは複合代入演算子であり、(非常に大まかに)翻訳します

x |= y;

x = x | y;

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

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

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

  • ~FileAttributes.Systemを除く すべての属性」を意味しますSystem~ビット単位ではありません)
  • & 「結果は、オペランドの両側で発生するすべての属性です」を意味します

したがって、それは基本的にマスクとして機能しています- (「システム以外のすべて」)に表示される属性のみを保持します。一般に:

  • |=ターゲットにビットを追加するだけです
  • &=ターゲットからビットのみを削除します

2
x = x | (y);それx |= y + z;は同じではないのでそれを説明するより良い方法ですx = x | y + z;
IronMensan

回答に感謝/しかし、私の目的(システム属性を削除する)のために、どちらを使用すべきですか(| =または&=)?
SilverLight 2011

1
@LostLord:Folder.Attributes &= ~FileAttributes.System;
ジョージ

33

a |= bは1回だけ評価されるa = a | bことを除いて同等aです
a &= bと等価であるa = a & bことを除く外はa一度だけ評価されます

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

Folder.Attributes &= ~FileAttributes.System;

~ビットごとの否定です。したがって、システムビットを除くすべてのビットを1に設定します。andマスクとそれを-ingは0にシステムを設定し、そのまま他のすべてのビットを残すためであろう0 & x = 01 & x = x、任意のためx


1
a一度だけ評価されるとはどういう意味ですか?それ以上に評価されるのはなぜですか?
18年

@silkfireこれは短絡評価と呼ばれ、参照en.wikipedia.org/wiki/Short-circuit_evaluation
Polluks

@Polluksつまり、基本的a |= bには実際にはどういう意味a = a || bですか?
シルクファイア

@silkfireはい、1つのパイプと2つのパイプを交換しないでください。
Polluks

3

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

あなたはそうすることができます:

Folder.Attributes ^= FileAttributes.System;

1
これにはANDではなくXORを使用したいと思います。
GameZelda

少し混乱している/〜が必要かどうか
SilverLight 2011

@LostLord 2つの方法は、私が知っている限り類似しています
Chris S、

@ChrisS ^= bitは、&= ~bitまだ設定されていない場合はビットを設定し、設定しません。
クロニクル

あなたは間違いなくXORを使いたくありません。それがなくなった場合、それはそれを元に戻すでしょう。
ジョンロード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.