Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

Аналог битового поля на C#

#c_sharp #cpp


Есть следующий код на C++:

#include 

using namespace std;

union
{
    unsigned short X;
    struct
    {  
        unsigned short param_01 :1; // DSL (младший бит числа X)
        unsigned short param_02 :1; // PPP
        unsigned short param_03 :1; // Link
        unsigned short param_04 :2; // битовое поле может содержать
        unsigned short param_05 :5; // более 1 бита
        unsigned short param_06 :1;
        unsigned short param_07 :1;
        unsigned short param_08 :2;
    } X_bit;
} Device;

int main()
{
    cin >> hex >> Device.X; // вводим число

    // Выводим результаты
    cout << Device.X_bit.param_01;
    cout << Device.X_bit.param_02;
    // и так далее

    return 0;
 }


Каким образом получить аналогичную функциональность на C#? Есть ли там битовые поля,
а если нету, как лучше работать с такими данными?
    


Ответы

Ответ 1



Для вашего случая можно воспользоваться структурой BitVector32. Для удобства, положим вот такой вспомогательный класс: class SectionHelper { BitVector32.Section? currSection = null; public BitVector32.Section AllocatedSection(int nbits) { // проверка if (nbits <= 0 || nbits > sizeof(short) * 8 - 1) throw new ArgumentException("wrong number of bits"); var max = checked((short)((1 << nbits) - 1)); currSection = currSection == null ? BitVector32.CreateSection(max) : BitVector32.CreateSection(max, currSection.Value); return currSection.Value; } } Пробуем: class Program { static void Main(string[] args) { // определяем битовые маски SectionHelper helper = new SectionHelper(); var dsl_s = helper.AllocatedSection(1); var ppp_s = helper.AllocatedSection(1); var link_s = helper.AllocatedSection(1); var param_04_s = helper.AllocatedSection(2); var param_05_s = helper.AllocatedSection(5); var param_06_s = helper.AllocatedSection(1); var param_07_s = helper.AllocatedSection(1); var param_08_s = helper.AllocatedSection(2); // пользуемся var bv = new BitVector32(0x341a); Console.WriteLine(bv[dsl_s]); Console.WriteLine(bv[ppp_s]); Console.WriteLine(bv[link_s]); Console.WriteLine(bv[param_04_s]); Console.WriteLine(bv[param_05_s]); Console.WriteLine(bv[param_06_s]); Console.WriteLine(bv[param_07_s]); Console.WriteLine(bv[param_08_s]); Console.WriteLine(); bv = new BitVector32(0xcbe5); Console.WriteLine(bv[dsl_s]); Console.WriteLine(bv[ppp_s]); Console.WriteLine(bv[link_s]); Console.WriteLine(bv[param_04_s]); Console.WriteLine(bv[param_05_s]); Console.WriteLine(bv[param_06_s]); Console.WriteLine(bv[param_07_s]); Console.WriteLine(bv[param_08_s]); } }

Комментариев нет:

Отправить комментарий