BitArray以错误的方式返回位?

时间:2012-01-30 16:04:29

标签: c# enumeration bitarray

此代码:

BitArray bits = new BitArray(new byte[] { 7 });
foreach (bool bit in bits)
{
    Console.WriteLine(bit ? 1 : 0);
}

给我以下输出:

11100000

不应该是相反的方式吗?像这样:

00000111

我知道有一点点大端,尽管这些术语只涉及字节的位置。据我所知,它们不会影响比特。

3 个答案:

答案 0 :(得分:11)

documentation for BitArray州:

  

数组中的第一个字节表示第0到第7位,第二个字节   byte表示位8到15,依此类推。至关重要   每个字节的位代表最低的索引值:“bytes [0]& 1”   表示位0,“bytes [0]& 2”表示位1,“bytes [0]& 4”   代表第2位,依此类推。

当索引位时,约定是从最低端开始,这是以二进制表示法写入时的右侧。但是,在枚举数组时,从索引0开始,因此它们从左到右而不是从右到左打印。这就是它向后看的原因。

例如,单词01011010 00101101(90 45)将被索引为:

 0  1  0  1  1  0  1  0  -  0  0  1  0  1  1  0  1
-----------------------    -----------------------
15 14 13 12 11 10  9  8     7  6  5  4  3  2  1  0

然后你将它作为new byte[] { 45, 90 }传递给构造函数,因为你首先传递它最不重要。打印出来时,它将按索引顺序显示为:1011010001011010,这与原始二进制表示法相反。

答案 1 :(得分:2)

文档没有明确说明,但我想迭代器会从LSB迭代到MSB。对我来说这听起来很合理(个人而言!),除非你打印出来的。我看了BitArray.GetEnumerator Method

答案 2 :(得分:2)

不是它是一个位数组,不是表示为位的数值。

它就像任何常规数组一样,为位操作添加了一些方法。就像你有一个int数组一样。你不会指望它是以相反的顺序,它只是按位置定位。

例如:

转换为BitArray的数字(以字节为单位)将如下所示:

2 = 01000000
5 = 10100000
8 = 00010000

它只存储值的位置,但不存储相对于二进制数值的相对位置。

以下是描述您正在使用的构造函数的链接:

http://msdn.microsoft.com/en-us/library/b3d1dwck.aspx

关键点是:

  

第一个值数组元素中的数字表示位0到   在图31中,数组中的第二个数字表示位32到63,和   等等。 每个整数的最低有效位代表最低位   索引值:“values [0]& 1”表示位0,“值[0]& 2”   表示位1,“值[0]和4”表示位2,依此类推。