2009-12-12 12 views
5

)。 a = 8、b = 2という2つの整数があるとします。 bは真です。私はフラグのコレクションで動作するようにその動作を使用しました。たとえば、フラグは1,2,4,8などとなり、それらのコレクションは一意になります。私はC#でそれを行う方法を見つけることができません、| &演算子はC++と同じように動作しません。私はC#の演算子についてのドキュメントを読んでいますが、まだそれは得られません。ビット単位Or:C#対C++

EDIT:

残念ながら、私はどこかで台無しに思えます。例:

これは、フラグに入れた値に "y"を返します。 3つの理由から明らかです。 8つは11になります。うーん...私がしたいのは、フラグコレクションを持っていることです.1,2,4,8,16と番号をつけたら、それが何なのかを判断できます。

答えて

14

&|演算子C#では、C/C++の場合と同様です。例えば 、2 | 8 10と2 & 8では差0

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

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

if ((2 & 8) != 0) ... // works 
+0

Any1にはこれが使用されていますか? –

+0

'int'は' bool'型ではないので、C++では 'bool'に変換されません。 – Noldorin

+6

@Noldorin:そうではありません - C(C99以前)はbool型を持たず、一度に(標準化の前に)C++もどちらもしませんでしたが、Cではbool(技術的にはBool) C++はそれをさらに長くしてきました。 –

8

C#で異なるビット単位や演算子ではありません。 C++とほとんど同じです。違いは、C#では整数からブール値への暗黙の変換がないことです。あなただけゼロに比較する必要があなたの問題を解決するために

if ((a | b) != 0) { 
    ... 
5

C/C++とは異なり、C#は算術演算とブール演算の間の厳密な分離を維持します。

C#の設計者は、整数型をブール値に自動的に変換することを考えていました。これは、C#ではないエラーのソースになるため、算術結果を明示的にブール値にする必要があります。比較:

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

私はそれが同様にC/C++でこれを行うには、おそらく悪いアイデアではないと思うが、私は、私は確かに厳密にそのアドバイスに従わない(と私は主張しないことを認めますよそれは非常に難しい)。

関連する問題