2013-12-11 11 views
9

Gdy używam SETALL w programie:Różnica między zestaw i ustawić wszystko w C#

BitArray bb = new BitArray(8) ; 
bb.SetAll(true); 

int[] dd = new int[1];   

bb.CopyTo(dd, 0); 

for (int i = 0; i < dd.Length; i++) 
    Console.WriteLine(dd[i]); 

// result is -1 

ale jeśli używam ustawić dla każdego elementu bitarray

BitArray bb = new BitArray(8) ; 
bb.Set(0,true); 
bb.Set(1, true); 
bb.Set(2, true); 
bb.Set(3, true); 
bb.Set(4, true); 
bb.Set(5, true); 
bb.Set(6, true); 
bb.Set(7, true); 

int[] dd = new int[1];   

bb.CopyTo(dd, 0);   

for (int i = 0; i < dd.Length; i++) 
    Console.WriteLine(dd[i]); 

// result is 255 

Dlaczego inny wynik w dwóch programu, gdy użycie Ustawić wynik jest -1, a gdy używać setall w drugim wyniku programu jest 255?

+0

korekta, i był w stanie powielać zachowanie. – paqogomez

Odpowiedz

8

To dlatego SetAll() metoda wygląda tak:

public void SetAll(bool value) 
{ 
    int num = value ? -1 : 0; 
    int arrayLength = BitArray.GetArrayLength(this.m_length, 32); 
    for (int i = 0; i < arrayLength; i++) 
    { 
     this.m_array[i] = num; 
    } 
    this._version++; 
} 

BitArray wykorzystuje int[] wewnętrznie do przechowywania bitów. Aby uzyskać new BitArray(8), używa tylko jednego int, ponieważ wystarczy do przechowywania 8 bitów. Ale cała przydzielona pamięć jest używana, gdy używasz metody CopyTo, aby uzyskać int[], więc otrzymasz wszystkie 32 bity z podstawowego int. a ponieważ używasz pętli for, ustawiasz tylko 8 najmniej znaczących bitów, które uzyskasz po odlaniu do int[] po użyciu pętli i -1, gdy robisz to za pomocą metody SetAll().

Możesz to udowodnić.

for (int i = 1; i <= 32; i++) 
{ 
    BitArray bb = new BitArray(i); 
    bb.SetAll(true); 

    BitArray bb2 = new BitArray(i); 
    for (int j = 0; j < i; j++) 
     bb2.Set(j, true); 

    int[] dd = new int[1]; 
    int[] dd2 = new int[1]; 

    bb.CopyTo(dd, 0); 
    bb2.CopyTo(dd2, 0); 
    Console.WriteLine("{0} - {1}", dd[0], dd2[0]); 
} 

Kod powyżej wydruków:

-1 - 1 
-1 - 3 
-1 - 7 
-1 - 15 
-1 - 31 
-1 - 63 
-1 - 127 
-1 - 255 
-1 - 511 
-1 - 1023 
-1 - 2047 
-1 - 4095 
-1 - 8191 
-1 - 16383 
-1 - 32767 
-1 - 65535 
-1 - 131071 
-1 - 262143 
-1 - 524287 
-1 - 1048575 
-1 - 2097151 
-1 - 4194303 
-1 - 8388607 
-1 - 16777215 
-1 - 33554431 
-1 - 67108863 
-1 - 134217727 
-1 - 268435455 
-1 - 536870911 
-1 - 1073741823 
-1 - 2147483647 
-1 - -1 
Powiązane problemy