5

)。a = 8、b = 2 の 2 つの整数があるとします。C++ では、a | b は真です。その動作を使用して、フラグのコレクションを操作しました。たとえば、フラグは 1、2、4、8 などであり、それらのコレクションは一意になります。|として、C#でそれを行う方法が見つかりません。および & 演算子は、C++ の場合のようには動作しません。C# の演算子に関するドキュメントを読みましたが、まだわかりません。

編集:

残念ながら、私はどこかで物事を台無しにしているようです。たとえば、次のコードをご覧ください。

byte flagCollection = 8;
byte flag = 3;

if ((flag | flagCollection) != 0) MessageBox.Show("y"); else MessageBox.Show("n");

これは、フラグに入力した値に対して「y」を返します。3 | 8 は 11 になります。うーん... 私がやりたいのは、1、2、4、8、16 のフラグ コレクションを用意することです。数値を指定すると、それがどのフラグであるかを判断できるようになります。

4

3 に答える 3

14

C#の&and|演算子は、C/C++ と同じです。たとえば、2 | 8は 10 で、2 & 8は 0 です。

違いは、 anintがブール値のように自動的に扱われないことです。 intおよびboolC# では異なる型です。を取得するには、intを別のと比較する必要があります。intbool

if (2 & 8) ...         //  doesn't work

if ((2 & 8) != 0) ...  //  works
于 2009-12-12T21:00:08.797 に答える
8

C# で異なるのは、ビットごとの and/or 演算子ではありません。これらは、C++ とほぼ同じように機能します。違いは、C# では整数からブール値への暗黙的な変換がないことです。

問題を解決するには、ゼロと比較するだけです。

if ((a | b) != 0) {
   ...
于 2009-12-12T20:59:30.793 に答える
5

C/C++ とは異なり、C# では算術演算とブール演算が厳密に分離されています。

C# の設計者は、整数型からブール値への自動変換が、C# にはないエラーの原因になると考えていたため、比較を導入して、算術結果を明示的にブール値の結果にする必要があります。

if ((a | b) != 0) {
    // ...
}

これを C/C++ でも行うのはおそらく悪い考えではないと思いますが、私がそのアドバイスに厳密に従わないことは認めます (そして、それほど難しいことを主張するつもりはありません)。

于 2009-12-12T21:03:43.583 に答える