Я пытаюсь инициализировать экземпляр 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.
Любая помощь будет действительно оценена!
Вы зацикливаетесь с неправильного направления. Попробуй это:
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();
Это проблема 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 и скоро.
Как указано в документации 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();