2012-01-30 31 views
13

此代码:BitArray以错误的方式返回位?

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

给我下面的输出:

11100000 

它不应该是周围的其他方式?像这样:

00000111 

我知道有一些小的大端,尽管这些术语只是指字节的位置。据我所知,它们不影响位。

回答

9

documentation for BitArray状态:

阵列中的第一个字节表示位0至7,第二 字节表示位8至15,等等。最低有效 位每个字节的表示最低索引值: “字节[0] & 1” 表示位0, “字节[0] & 2” 表示位1, “字节[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,这与原始二进制表示法相反。

2

该文档没有明确说明它,但我想迭代器从LSB迭代到MSB。对我来说听起来很合理(亲自!),除非你打印出这些位。我看了一下BitArray.GetEnumerator Method

2

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

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

例如:

号码(以字节)转换为BitArray会出来,如:

2 = 01000000 
5 = 10100000 
8 = 00010000 

它只是存储的值的不相对的位置,但你会从二进制数值除外。

这里是描述正在使用的构造的链接:

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

的关键点是:

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