2009-12-12 12 views
5

). Supongamos que tiene dos enteros, a = 8, b = 2. En C++ a | b es cierto. Usé ese comportamiento para trabajar con colecciones de banderas. Por ejemplo, las banderas serían 1, 2, 4, 8 y así sucesivamente, y cualquier colección de ellas sería única. No puedo encontrar cómo hacer eso en C#, ya que | y los operadores & no se comportan como lo harían en C++. Leo la documentación sobre los operadores en C# pero aún no lo entiendo.Bitwise O: C# contra C++

EDIT:

Por desgracia, parece que meterse cosas en algún lugar. Tome este código, por ejemplo:

byte flagCollection = 8; 
byte flag = 3; 

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

Esto devuelve "y" para cualquier valor que puse en la bandera. Lo cual es obvio, porque 3 | 8 sería 11. Hmmmm ... lo que quiero hacer es tener una colección de banderas: 1, 2, 4, 8, 16 y cuando doy un número, para poder determinar qué banderas es.

Respuesta

14

Los & y | operadores en C# son los mismos que en C/C++. Por ejemplo, 2 | 8 es 10 y 2 & 8 es 0.

La diferencia es que un int no se trata automáticamente como un valor booleano. int y bool son tipos distintos en C#. Necesita comparar un int a otro int para obtener un bool.

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

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

Any1 tiene un uso de ejemplo para esto? –

+0

'int' no se convierte' a 'bool' en C++, per se, ya que no hay' bool' tipo - 'int's se usan como' bool's. – Noldorin

+6

@Noldorin: No es así - C (antes de C99) no tenía un tipo bool, y en un momento (mucho antes de la estandarización) C++ tampoco, pero C ha tenido bool (técnicamente se llama _Bool) por aproximadamente un década, y C++ ha tenido incluso más tiempo. –

8

No es el bitwise y/o los operadores que son diferentes en C#. Funcionan casi igual que en C++. La diferencia es que en C# no hay una conversión implícita de entero a booleano.

Para arreglar el problema sólo tiene que comparar a cero:

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

diferencia de C/C++, C# mantiene una separación bastante estricta entre operaciones aritméticas y booleanas.

Los diseñadores de C# consideraron que la conversión automática de tipos enteros a booleanos era una fuente de errores que preferían que C# no tuviera, por lo que debe convertir sus resultados aritméticos explícitamente en un resultado booleano introduciendo un Comparación:

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

Creo que probablemente no es una mala idea hacer esto en C/C++, así, pero voy a admitir que desde luego no seguir estrictamente ese consejo (y no me gustaría argumentar a favor de es muy difícil).