BitArray возвращает биты неправильно?

Этот код:

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

Дает мне следующий вывод:

11100000

Не должно ли быть наоборот? Как это:

00000111

Я знаю, что здесь есть маленький и большой порядок байтов, хотя эти термины относятся только к позиции байтов. Насколько я знаю, они не влияют на биты.

3 ответа

Решение

Документация для 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, и скоро.

Другие вопросы по тегам