Инициализировать BitArray из целого числа

1

Я пытаюсь инициализировать экземпляр System.BitArray из целочисленного значения. Однако, похоже, что я не получаю правильные значения.

Мой код

        var b = new BitArray(BitConverter.GetBytes(0xfa2));
        for (int i = 0; i < b.Count; i++)
        {
            char c = b[i] ? '1' : '0';
            Console.Write(c);
        }
        Console.WriteLine();

Я также пробовал без BitConverter:

        var b = new BitArray(new int[] { 0xfa2 });

Но ни одна из этих попыток не работает. Это попытки, которые были предложены здесь: Преобразование int в бит-массив в.NET.

Мой выход: 01000101111100000000000000000000. Предполагаемый результат: 111110100010.

Любая помощь будет действительно оценена!

  • 0
    Кажется, правильно, за исключением некоторых ведущих нулей
  • 0
    Это связано с живучестью архитектуры. Возможный дубликат stackoverflow.com/questions/217980/…
Показать ещё 1 комментарий
Теги:

3 ответа

4
Лучший ответ

Вы зацикливаетесь с неправильного направления. Попробуй это:

    var b = new BitArray(BitConverter.GetBytes(0xfa2));
    for (int i = b.Count-1; i >= 0; i--)
    {
        char c = b[i] ? '1' : '0';
        Console.Write(c);
    }
    Console.WriteLine();
  • 0
    Это оно. Спасибо!
2

Это проблема Little-Endian vs Big-Endian, поэтому вам необходимо учитывать энтузиазм архитектуры hw. Также на основе документации вам нужно изменить способ печати BitArray.

byte[] buffer = BitConverter.GetBytes((ushort)0xfa2);

if (BitConverter.IsLittleEndian) Array.Reverse(buffer);

var b = new BitArray(buffer);

for (int i = 0; i < b.Count; i+=8)
{
    for (int j=i + 7; j >= i; j--)
    {
        char c = b[j] ? '1' : '0';
        Console.Write(c);
    }
}

Console.WriteLine();

Справка:

Первый байт в массиве представляет биты с 0 по 7, второй байт представляет биты с 8 по 15 и так далее. Наименьший значащий бит каждого байта представляет наименьшее значение индекса: "байты [0] и 1" представляют бит 0, "байты [0] и 2" представляют бит 1, "байты [0] и 4" представляют бит 2 и скоро.

  • 0
    Спасибо за подробный ответ !!
1

Как указано в документации BitArray Constructor (Int32 []):

Число в элементе массива первых значений представляет биты с 0 по 31, второе число в массиве представляет биты с 32 по 63 и т.д. Наименьший значащий бит каждого целого представляет наименьшее значение индекса: "значения [0] и 1" представляют бит 0, "значения [0] и 2" представляют бит 1, "значения [0] и 4" представляют бит 2, и скоро.

При использовании этого конструктора нет необходимости проверять соответствие, просто обратный порядок вывода:

var b = new BitArray(new int[] { 0xfa2 });
// skip leading zeros, but leave least significant bit:
int count = b.Count;
while (count > 1 && !b[count-1])
    count--;
// output
for (int i = count - 1; i >= 0; i--)
{
    char c = b[i] ? '1' : '0';
    Console.Write(c);
}
Console.WriteLine();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню