BitArray возвращает биты неправильно? - PullRequest
13 голосов
/ 30 января 2012

Этот код:

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

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

11100000

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

00000111

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

Ответы [ 3 ]

11 голосов
/ 30 января 2012

Документация для BitArray гласит:

Первый байт в массиве представляет биты с 0 по 7, второй Байт представляет биты с 8 по 15 и так далее. Наименее значимый Бит каждого байта представляет самое низкое значение индекса: «bytes [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 голосов
/ 30 января 2012

Нет, это битовый массив, а не числовое значение, представленное в битах.

Это похоже на любой обычный массив с некоторыми методами, добавленными для битовых операций.Также как если бы у вас был массив 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, «значения [0] & 4»"представляет бит 2 и т. д.

2 голосов
/ 30 января 2012

В документации нет явных сведений об этом, но я думаю, что итератор выполняет итерации от LSB до MSB.Звучит разумно для меня (лично!), Если только вы не распечатываете биты.Я посмотрел на Метод BitArray.GetEnumerator .

...