BitArray以错误的方式返回位

本文关键字:返回 方式 错误 BitArray | 更新日期: 2023-09-27 18:22:05

此代码:

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

给我以下输出:

11100000

不是应该反过来吗?像这样:

00000111

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

BitArray以错误的方式返回位

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,这是原始二进制表示法的反面。

文档中没有明确说明,但我猜迭代器会从LSB迭代到MSB。对我来说(就我个人而言)听起来很合理,除非你在打印这些片段。我看了一下BitArray.GetEnumerator方法。

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

它就像任何添加了一些用于位操作的方法的常规数组一样。就像你有一个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,"values[0]&2"表示位1,"values[0]和4"表示位2,依此类推