2012-02-07 11 views
13

Estoy buscando una forma de trabajar basada en operador con máscaras de bits y operaciones booleanas bit a bit (XOR/NOR/OR/AND/NOT/EQV/etc). Generalmente I realmente como un enfoque de estilo de método de extensión, pero en este caso, me parece un poco complicado.BitArray y XOR

¿Hay alguna manera más extraña de trabajar con bits en C#?

 BitArray a = new BitArray(0x001); 
     BitArray b = new BitArray(0x100); 
     BitArray c = new BitArray(0x010); 

     BitArray test = a | b; // won't compile 
     BitArray test2 = a^c; // won't compile 

     BitArray test3 = a.Or(b); // compiles 
     BitArray test4 = a.Xor(c); // compiles 
+3

¿Por qué no solo operar en ints? int a = 0x001; int b = 0x100; int test = a | segundo; funciona bien –

+9

No creo que [el constructor que toma 'int'] (http://msdn.microsoft.com/en-us/library/4ty2t3fx.aspx) haga lo que crees que hace. – svick

+0

@RobertRouhani Eso funciona para este ejemplo específico, pero ¿qué pasa con un número arbitrario de bits? tendrías que tener una estructura separada para un entero de 96 bits, por ejemplo. – annonymously

Respuesta

20

No hay forma de hacerlo directamente con BitArray, pero siempre puedes crear una clase contenedora que contenga un BitArray, y definir tus propios operadores allí.

Por supuesto, si usted está tratando con 64 bits o menos, es posible que utilices una long o ulong y hacerse con él ...

+0

O si tiene hasta 32bits, solo use 'BitVector32' :) – leppie

+0

@leppie Si son 32 bits, la manera más fácil sería usar un' int' o 'uint' estándar – annonymously

+0

@annonymously: No si no conoce los bitops. Para un principiante, BitVector32 sería más fácil, especialmente cuando se trata de máscaras, etc. – leppie

6

Desafortunadamente, puesto que no hay sobrecarga de operadores en clases de extensión (la sobrecarga operador tiene que ser definido en la clase o estructura en sí), no hay forma real de la traducción de estos métodos en los operadores. Espero (como estoy seguro que muchos otros también lo hacen) que esto cambiará en el futuro, pero por ahora no hay forma de hacerlo.

12

No hay manera de hacer esto con BitArray y por una buena razón: las operaciones como Or o Xormodifican el primer operando. Eso no es lo que normalmente hace | o ^.

Si lo desea, puede crear un contenedor que tenga los operadores que desee, incluido copiar el valor del primer operando antes de realizar la operación.

Cuestiones relacionadas