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

Этот код:

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

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

11100000

Разве не должно быть наоборот? Нравится:

00000111

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


person haiyyu    schedule 30.01.2012    source источник


Ответы (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, что является обратным исходному двоичному представлению.

person Tadmas    schedule 30.01.2012

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

person Matthias Meid    schedule 30.01.2012

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

Это как любой обычный массив с добавлением некоторых методов для битовых операций. Так же, как если бы у вас был массив int. Вы не ожидаете, что он будет в обратном порядке, он просто занимает позицию за позицией.

Eg:

Числа (в байтах), преобразованные в 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 и так далее.

person Kelsey    schedule 30.01.2012