2013-12-11 32 views
9

當我在程序中使用SETALL:差異,並設置所有的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 

但是,如果使用設置的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 

爲什麼不同的結果,每一個元素有兩種程序時使用設置結果是-1,在第二個程序結果中使用setall時是255?

+0

修正,我是能夠複製的行爲。 – paqogomez

回答

8

這是因爲SetAll()方法看起來像這樣:

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使用int[]內部存儲你的位。要獲得new BitArray(8)它只使用一個int,因爲這足以存儲8位。但是當您使用CopyTo方法獲取int[]時,將使用整個分配的內存,因此您可以從底層的int獲取全部32位。因爲當你使用for循環時,你只能設置8個最有意義的位,當你使用循環後轉換爲int[]時,你得到255,當你使用SetAll()方法時,轉換爲-1

你可以證明這一點。

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

以上代碼打印:

-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