gpt4 book ai didi

c# - c#中set和set all的区别

转载 作者:太空狗 更新时间:2023-10-29 17:50:44 25 4
gpt4 key购买 nike

当我在程序中使用 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

但是如果我对位数组的每个元素都使用 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

为什么在两个程序中使用 set 结果是 -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++;
}

BitArray 在内部使用 int[] 来存储您的位。要获得 new BitArray(8),它只使用一个 int,因为它足以存储 8 位。但是,当您使用 CopyTo 方法获取 int[] 时,将使用整个分配的内存,因此您可以从底层 int 获取所有 32 位。并且因为当您使用 for 循环时,您只设置了 8 个最不有意义的位,当使用循环和 -1 转换为 int[] 时,您会得到 255 > 当您使用 SetAll() 方法执行此操作时。

你可以证明这一点。

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

关于c# - c#中set和set all的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20511938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com