Подтвердить что ты не робот

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

Этот код:

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

Дает мне следующий результат:

11100000

Разве это не так? Вот так:

00000111

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

4b9b3361

Ответ 1

В документации для 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

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

Ответ 3

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

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