2010-09-10 9 views
6

Tengo una matriz System.Collections.BitArray (~ 3000 elementos) y me gustaría cambiar todos los bits a la izquierda por 1. Sin embargo, la colección no parece apoyar esa operación (es decir, bitArray < < 1 no funciona y no hay ningún método). ¿Alguna idea sobre cómo hacer eso?BitArray - Shift bits

Gracias!

Respuesta

4

Este sencillo fragmento muestra una forma manual de hacerlo. El valor de bitArray[0] se sobrescribe:

//... bitArray is the BitArray instance 

for (int i = 1; i < bitArray.Count; i++) 
{ 
    bitArray[i - 1] = bitArray[i]; 
} 

bitArray[bitArray.Count - 1] = false // or true, whatever you want to shift in 

hace que este método una extensión no debería ser un gran problema.

+2

Eso genial ... pero lento. Pensé que habría un operador o método especial ya que estamos jugando con bits. – Martin

+0

Puedes recorrer el largo camino de copiar el contenido de tu 'BitArray' a' bool [] 'y luego copiar los datos a otro' bool [] 'usando offsets. Finalmente, puede recrear su 'BitArray' a partir del' bool [] 'resultante. Pero dudo que sea más rápido que acceder a cada elemento para tus ~ 3000 bits. –

0

La manera más fácil que tengo de pasar de la cabeza es convertir el BitArray en una estructura BigInt o similar que admite cambios y retrocesos a nivel de bit. Ahora, el BigInteger incorporado en .NET 4 no admite cambios, creo, pero hay otros que sí lo hacen, como la implementación de Mono.

2

System.Numerics.BigInteger es compatible con el cambio de bit.

+1

Con una advertencia: "A diferencia de la operación de desplazamiento a la izquierda en modo bit con primitivas enteras, el método LeftShift conserva el signo del valor original de BigInteger". Entonces (-3 << 30)! = ((BigInteger) (- 3) << 30) – FarmerBob

+0

Y la razón para esto es que el tipo de BigInteger está Firmado. – detay

1

No estoy seguro de cómo acerca de la eficiencia, pero este método de extensión hace el trabajo

public static BitArray ShiftRight(this BitArray instance) 
{ 
    return new BitArray(new bool[] { false }.Concat(instance.Cast<bool>().Take(instance.Length - 1)).ToArray()); 
} 
+1

OP pidió un turno a la izquierda. Me gustó esto, así que aquí está una versión de desplazamiento izquierda: return new BitArray ( (instance.Cast () .Take (instance.Length - 1) .ToArray()). Concat (new bool [] {newState}) .ToArray() ); – xgo

+0

De hecho. Gracias :) – eye

0

Recrear BitArray a sí mismo como una envoltura alrededor de ulong[]; implementar cambios de bits en un número menor que 64 es un pedazo de pastel de esa manera y tomará menos tiempo y matará menos osos polares que los otros enfoques sugeridos. Al desconfiar de los "bits que caerían del final", si desea conservarlos, puede que tenga que hacer crecer la matriz (o no, si son cero y usted dice que el elemento no existente contiene implícitamente cero).

Cuestiones relacionadas