对c#中bitarray类的copyto()方法的疑问

sbyte[]arr=newsbyte[10];BitArraybit=newBitArray(5,true);bit.CopyTo(arr,0);foreach(sby... sbyte [] arr =new sbyte [10];
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的数量会变为原来的一半??????? 求解答求指点!!!!
展开
 我来答
fujie724
2013-06-09 · TA获得超过1187个赞
知道小有建树答主
回答量:154
采纳率:100%
帮助的人:276万
展开全部

首先感慨一下很少看见这种问题,说明楼主是对喜欢思考本质的人。


先说一下,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,这个书里都没讲过
追答
好的
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式