2013-12-11 18 views
9

Quando uso SetAll in programma:Differenza tra set e impostare il tutto in 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 

ma se uso impostato per ogni elemento di 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 

Perché diverso risultato in due programmi quando l'uso il risultato impostato è -1 e quando si usa setall nel secondo programma il risultato è 255?

+0

correzione, sono stato in grado di riprodurre il comportamento. – paqogomez

risposta

8

Questo perché SetAll() metodo sembra che:

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 utilizza int[] internamente per memorizzare i bit. Per ottenere new BitArray(8) utilizza solo uno int, perché è sufficiente per memorizzare 8 bit. Ma l'intera memoria allocata viene utilizzata quando si utilizza il metodo CopyTo per ottenere int[], in modo da ottenere tutti i 32 bit dal sottostante int. e poiché quando usi il ciclo for imposti solo 8 bit meno significativi ottieni 255 quando lanci su int[] dopo aver usato il ciclo e -1 quando lo fai usando il metodo SetAll().

Puoi dimostrarlo.

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]); 
} 

Codice sopra stampe:

-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