use*_*938 9 c# asp.net arrays bit
当我在程序中使用setall时:
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
Run Code Online (Sandbox Code Playgroud)
但如果我为bitarray的每个元素使用set
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
Run Code Online (Sandbox Code Playgroud)
当使用设置结果为-1并且在第二个程序结果中使用setall为255时,为什么两个程序中的不同结果?
那是因为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++;
}
Run Code Online (Sandbox Code Playgroud)
BitArray用于int[]内部存储您的位.要使new BitArray(8)它只使用一个int,因为这足以存储8位.但是当你使用CopyTo方法获取时会使用整个分配的内存int[],所以你可以从底层获取所有32位int.并且因为当你使用for循环时,你只需要设置8个最有意义的位,你int[]在使用循环后-1使用SetAll()方法进行转换时得到255 .
你可以证明这一点.
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]);
}
Run Code Online (Sandbox Code Playgroud)
以上代码打印:
-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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |