Что значат : в переменной С++ Builder и как реализовать тоже на C# [дубликат]

414
29 декабря 2016, 05:51

На данный вопрос уже ответили:

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

Помогите разобраться, что значит

:

В переменной ниже приведу структуру на С++ Builder:

typedef struct {
    unsigned int nr:8;   //
    unsigned int y:8;    // 1
    unsigned int sm:3;   // 2
    unsigned int d:5;    // 3
    unsigned int m:4;    // 4
    unsigned int r:4;    // 5
} n_def; 

Что именно значит число после :? nr:8 или 3 или 5 ..... и т.д.? И как тоже самое реализовать на C#?

Дело в том что мне нужно прочитать данные из бинарного файла, и как я понял мне для начала нужно прочитать весь блок а затем разбить его на биты ? в C# чтение производиться так:

         using (BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open)))
            {
                // пока не достигнут конец файла
                // считываем каждое значение из файла
                while (reader.PeekChar() > -1)
                {
                    int numb = reader.ReadInt32();
                    uint nr = reader.ReadUInt32(); // переменная которую нужно разбить на биты 
   }
} 

Я правильно понял ? как правильнее реализовать ? может лучше использовать маршалинг ? Спасибо за ваши ответы

Answer 1

Двоеточие применяется для того, чтобы указать размер переменной в битах. Такая запись работает только внутри структур, где несколько небольших значений из 2-х или 3-х бит могут быть слиты в одну 16, 32 или 64-хбитовую целую переменную.

В вашем примере все переменные поместятся в 32-хбитовое целое число. В действительности это и будет одна целая переменная, а компилятор сгенерирует вам код для доступа к отдельным битам.

На C#, как и в C++ вместо такой записи часто применяют прямую манипуляцию битами. Например, чтобы выделить три бита, начиная с пятого, вы делаете так:

var y = (x >> 4) & 0x07;

Сначала вы сдвигаете число на 4 бит вправо, теряя младшие 4 бита. Затем накладываете маску 000001112, стирая старшие 5 бит и оставляя младшие 3. В результате вы получаете три бита: пятый, шестой и седьмой.

Чтобы установить эти биты вы можете сначала стереть их, а затем применить операцию ИЛИ:

var y = (y & 0x8F) | (x << 4);

Здесь 0x8F это 100011112, а х содержит новое значение для этих 3-х бит.

Впрочем, в C# есть структура BitVerctor32, которая поможет работать с отдельными битами или группами бит.

READ ALSO
Написать синтез речи

Написать синтез речи

Хочу написать синтез речиОпыт работы с С# WinFoms

528
Помогите доделать сайт на mvc [требует правки]

Помогите доделать сайт на mvc [требует правки]

Для резюме хочу сделать простой сайт на mvc с отзывами, админпанелью

387
Как загружать файлы не упираясь в лимиты I/O?

Как загружать файлы не упираясь в лимиты I/O?

Проблема заключается в лимитах хостинга на чтение/запись, и при загрузке от 100 файлов(фоток) за раз, сервер упирается в лимиты и сбрасывает...

469
Как получить запись из .env

Как получить запись из .env

Добавляю в файлenv новое значение, как его получить в шаблоне или контроллере?

425