Преобразовать 16-разрядное целочисленное слово состояния без знака в bitarray - PullRequest
2 голосов
/ 07 апреля 2020

Я искал все выше и ниже, чтобы найти простой способ (как в C ++) сделать это в C#, наверное, я не знаю конкретных c условий поиска. В C ++ я использую приведенный ниже код для вставки 16-разрядного целого числа без знака, затем я могу использовать его, чтобы легко добраться до отдельных битов. Как мне сделать это в C#? Я попытался BitArray, но, похоже, он не предоставляет способ ввести беззнаковое 16-битное значение и затем перейти к битам. Возможно, BitArray не так.

Используя этот способ, я могу прочитать значение регистра состояния с моего устройства (шагового двигателя), присвоить это значение битовому полю и легко получить доступ к битам внутри него без дополнительного кода.

Помощь очень ценится.

typedef union bitfield16_union
{
    U16 uiWord;    // unsigned short
    struct
    {
        unsigned short    b0 : 1;      // LSB
        unsigned short    b1 : 1;
        unsigned short    b2 : 1;
        unsigned short    b3 : 1;
        unsigned short    b4 : 1;
        unsigned short    b5 : 1;
        unsigned short    b6 : 1;
        unsigned short    b7 : 1;
        unsigned short    b8 : 1;
        unsigned short    b9 : 1;
        unsigned short    b10 : 1;
        unsigned short    b11 : 1;
        unsigned short    b12 : 1;
        unsigned short    b13 : 1;
        unsigned short    b14 : 1;
        unsigned short    b15 : 1;      // MSB
    } b;
    // ************
} BITFIELD16;
// ************


main
{ 
BITFIELD16 statusWord;

statusWord.uiWord = 154;
if(statusWord.b.b3) {do something}
} 

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Хотя C# поддерживает перекрывающиеся структуры с явным макетом, он не поддерживает его вплоть до уровня отдельных битов. Таким образом, ваш лучший выбор здесь, вероятно, вместо этого использовать битовые операции. Это не обязательно утомительно:

public ushort Value { get; set; }
public bool this[int index] {
    get => (Value & (1 << index)) != 0;
    set {
        if (value) Value |= (ushort)(1 << index);
        else Value &= (ushort)~(1 << index);
    }
} // Note untested

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

bool b3 = thing[3];
thing[5] = false;
0 голосов
/ 07 апреля 2020

Вы можете преобразовать uint32 в его двоичное строковое представление, используя Convert.ToString().

uint32 someNumber = 16384;
string binaryString = Convert.ToString(someNumber, 2);

Оттуда вы можете создать массив логических значений, используя Select.

bool[] bits = binaryString.Select( x => x == '1' ).ToArray();

В зависимости от того, как вы будете индексировать в битовый массив sh, вы можете захотеть изменить его. Его изменение означает, что младший значащий бит будет с индексом 0:

bool[] bits = binaryString.Reverse().Select( x => x == '1' ).ToArray();
...