BitArray возвращает бит неправильным образом?
Этот код:
BitArray bits = new BitArray(new byte[] { 7 });
foreach (bool bit in bits)
{
Console.WriteLine(bit ? 1 : 0);
}
Дает мне следующий результат:
11100000
Разве это не так? Вот так:
00000111
Я знаю, что есть маленький и большой endian, хотя эти термины относятся только к позиции байтов. Насколько я знаю, они не влияют на биты.
Ответы
Ответ 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 и т.д.