对c#中bitarray类的copyto()方法的疑问
BitArray bit = new BitArray(5,true) ;
bit.CopyTo(arr,0);
foreach (sbyte i in arr) { Console.Write(i); }
Console.ReadLine();
输出结果是 -10000 00000
为什么能输出结果?为什么没错?—1是怎么来的?为什么就1个—1,而且当我把sbyte换成 int 时-1的数量会变为原来的一半??????? 求解答求指点!!!! 展开
首先感慨一下很少看见这种问题,说明楼主是对喜欢思考本质的人。
先说一下,sbyte类型,范围-128 到 127,有符号 8 位整数。
这里的8位指的是内存中的,也就是二进制的位数。
比如,如果你存的是36,实际内存中存的是 0010 0100。
而BitArray存的是位数据,数组中每个元素代表一位,true为1,false为0。
在你的代码中,给BitArray初始化了5个位默认值为true,也就是形成了。
11111
===========================================================
1、先来解释一下为什么只有一个-1,剩下9个都是0
当你CopyTo的时候,由于arr的第一个元素arr[0]是一个sbyte,其中含有8个位。
所以bit里的数据实际上全部赋到了arr[0]里,并没有操作到后面的arr[1] ~ arr[9]。
所以arr[1] ~ arr[9] 保持了默认值0。
这也就是为什么后面始终都是9个0的原因。会变化的只有第一个。
2、接下来解释为什么会是-1
因为bit是位,arr[0]是sbyte。
所以实际上程序将bit的每一位赋到了arr[0]的每一位上去。
由于bit只有5位,而arr[0]有8位,缺失的那3位自动补充了你给BitArray的初值。也就是形成了
[111]1 1111
而1111 1111的二进制,表示有符号的十进制数的-1。(请参考二进制和十进制的转换)
所以就导致arr[0]的值变成了-1。
你还可以做一个实验。若代码改成这样:
sbyte [] arr =new sbyte [10];
itArray bit = new BitArray(5,false) ;//默认值设为false,也就是0
bit.Set(0,true);//依次对5个位设为1
bit.Set(1,true);
bit.Set(2,true);
bit.Set(3,true);
bit.Set(4,true);
bit.CopyTo(arr,0);
则bit中依然是5位1
11111
按照道理来说,结果应该与原来一样,
但CopyTo到arr之后,你会发现arr的值变成了31 0 0 0 0 0 0 0 0 0
也就是arr[0]变成了31。为什么呢?
因为系统将前面不够的3位补成了你的默认值0,变成了
[000]1 1111
在二进制中,0001 1111表示的正是31。
3、总结
所以,程序没有出错,而且给你输出了以上的结果。这都是位赋值产生的。
至于你说的把sbyte换成int。我实测了以后发现结果并没有什么不同。
结果都是基于以上的过程产生的。
谢谢采纳,祝学习愉快。
非常感谢,原来bitarray会自动生成一些true和false,这个书里都没讲过
好的