Как вернуть биты из байта - PullRequest
2 голосов
/ 15 ноября 2010

Кажется элементарным, но я не уверен, как получить каждый бит из байта. Спасибо за помощь

Ответы [ 5 ]

3 голосов
/ 15 ноября 2010

Биты «пронумерованы» от 0 до 7 справа налево.Таким образом, чтобы получить 5-й бит, вы должны использовать byte & (1<<5)
Я уверен, что есть более ясный способ объяснить это> _>

РЕДАКТИРОВАТЬ: это будет работать в операторе IF, ноесли вы хотите только 1 или 0, используйте решение winwaed.

2 голосов
/ 15 ноября 2010

Как уже опубликовал RyuuGan, вы должны использовать BitArrary . Вы просто помещаете данные в него, вызывая конструктор с требуемыми элементами.

byte[] myBytes = new byte[5] { 1, 2, 3, 4, 5 };
BitArray bitArray = new BitArray( myBytes );

Впоследствии у экземпляра есть несколько интересных свойств, облегчающих доступ к каждому биту. Сначала вы можете просто вызвать оператор индекса, чтобы получить или установить состояние каждого бита:

bool bit = bitArray[4];
bitArray[2] = true;

Также вы можете перечислять все биты, просто используя цикл foreach (или любой другой LINQ-материал, который вам нравится)

foreach (var bit in bitArray.Cast<bool>())
{
    Console.Write(bit + " ");
}

Возвращение от битов к какому-то определенному типу (например, int) немного сложнее, но с помощью методов расширения это довольно просто:

public static class Extensions
{
    public static IList<TResult> GetBitsAs<TResult>(this BitArray bits) where TResult : struct
    {
        return GetBitsAs<TResult>(bits, 0);
    }

    /// <summary>
    /// Gets the bits from an BitArray as an IList combined to the given type.
    /// </summary>
    /// <typeparam name="TResult">The type of the result.</typeparam>
    /// <param name="bits">An array of bit values, which are represented as Booleans.</param>
    /// <param name="index">The zero-based index in array at which copying begins.</param>
    /// <returns>An read-only IList containing all bits combined to the given type.</returns>
    public static IList<TResult> GetBitsAs<TResult>(this BitArray bits, int index) where TResult : struct
    {
        var instance = default(TResult);
        var type = instance.GetType();
        int sizeOfType = Marshal.SizeOf(type);

        int arraySize = (int)Math.Ceiling(((bits.Count - index) / 8.0) / sizeOfType);
        var array = new TResult[arraySize];

        bits.CopyTo(array, index);

        return array;
    }
}

Имея это в виду, вы можете просто выйти из этого с помощью одной строки кода:

IList<int> result = bitArray.GetBitsAs<int>();
2 голосов
/ 15 ноября 2010

Попробуйте использовать BitArray .

byte[] myBytes = new byte[5] { 1, 2, 3, 4, 5 };
BitArray myBA3 = new BitArray( myBytes );
1 голос
/ 15 ноября 2010

Использовать битовый сдвиг.

Например.Бит 3: b = (значение >> 3) & 1;

Финальный и маскирующий бит 1. Если вы хотите логическое значение, просто сравните (==) вышеупомянутое значение 1

1 голос
/ 15 ноября 2010

использование

 Convert.ToString (value, 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...