2012-01-30 12 views
13

este código:BitArray devuelve los bits por el camino equivocado?

BitArray bits = new BitArray(new byte[] { 7 }); 
foreach (bool bit in bits) 
{ 
    Console.WriteLine(bit ? 1 : 0); 
} 

me da el siguiente resultado:

11100000 

¿No debería ser al revés? De esta manera:

00000111 

Soy consciente de que hay un pequeño y gran endian, aunque esos términos solo hacen referencia a la posición de los bytes. Hasta donde yo sé, no afectan los bits.

Respuesta

9

Los documentation for BitArray estados:

El primer byte de la matriz representa los bits 0 a 7, la segunda byte representa los bits 8 a 15, y así sucesivamente. El menos significativo bit de cada byte representa el valor de índice más bajo: "bytes [0] & 1" representa el bit 0, "bytes [0] & 2" representa el bit 1, "bytes [0] & 4" representa bit 2, y así sucesivamente.

Al indexar los bits, la convención debe comenzar en el extremo menos significativo, que es el lado derecho cuando se escribe en notación binaria. Sin embargo, al enumerar la matriz, comienza en el índice 0, por lo que se imprimen de izquierda a derecha en lugar de derecha a izquierda. Es por eso que mira hacia atrás.

Por ejemplo, la palabra 01011010 00101101 (90 45) sería indexado como:

0 1 0 1 1 0 1 0 - 0 0 1 0 1 1 0 1 
----------------------- ----------------------- 
15 14 13 12 11 10 9 8  7 6 5 4 3 2 1 0 

y que le pasarlo al constructor como new byte[] { 45, 90 } ya que se pasa menos significativo en primer lugar. Cuando se imprima, se mostraría en orden de índice como: 1011010001011010, que es el inverso de la notación binaria original.

2

La documentación no es explícita al respecto, pero supongo que el iterador itera desde el LSB al MSB. Suena razonable para mí (¡personalmente!), A menos que esté imprimiendo los bits. Eché un vistazo al BitArray.GetEnumerator Method.

2

No, es una matriz de bits, no un valor numérico representado como bits.

Es como cualquier matriz regular con algunos métodos agregados para operaciones de bits. Como si tuvieras una serie de int. No esperarías que esté en el orden inverso, simplemente toma su posición por posición.

Ej:

Números (en un byte) convierte a un BitArray saldría como:

2 = 01000000 
5 = 10100000 
8 = 00010000 

etc.

Simplemente almacena la posición del valor pero no relativa como lo haría excepto desde un valor numérico binario.

aquí es un enlace que describe el constructor que está utilizando:

http://msdn.microsoft.com/en-us/library/b3d1dwck.aspx

El punto clave es:

El número en el elemento de primeros valores de matriz representa los bits 0 a través de 31, el segundo número en la matriz representa los bits 32 a 63 y , etc. el bit menos significativo de cada número entero representa el valor más bajo índice: "valores [0] & 1" representa el bit 0 "los valores [0] & 2" representa bit 1, "valores [0] & 4" representa bit 2, y así sucesivamente.

Cuestiones relacionadas