2013-12-11 10 views
9

Khi tôi sử dụng setall trong chương trình:Sự khác nhau giữa quy định và đặt tất cả trong 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 

nhưng nếu tôi sử dụng thiết cho mọi phần tử của 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 

Tại sao khác nhau kết quả trong hai chương trình khi sử dụng thiết lập kết quả là -1 và khi sử dụng setall trong kết quả chương trình thứ hai là 255?

+0

chỉnh, tôi đã có thể lặp lại hành vi đó. – paqogomez

Trả lời

8

Đó là bởi vì SetAll() phương pháp trông như thế:

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 sử dụng int[] trong nội bộ để lưu trữ các bit của bạn. Để có được new BitArray(8) nó chỉ sử dụng một int, bởi vì đó là đủ để lưu trữ 8 bit. Nhưng toàn bộ bộ nhớ được cấp phát được sử dụng khi bạn sử dụng phương thức CopyTo để nhận được int[], do đó, bạn nhận được tất cả 32 bit từ cơ bản int. và bởi vì khi bạn sử dụng vòng lặp for, bạn chỉ đặt 8 bit có ý nghĩa nhất mà bạn nhận được 255 khi truyền tới int[] sau khi sử dụng vòng lặp và -1 khi bạn sử dụng phương pháp SetAll().

Bạn có thể chứng minh điều đó.

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

Mã trên bản in:

-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 
Các vấn đề liên quan