Страницы

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

понедельник, 8 октября 2018 г.

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

На данный вопрос уже ответили: Аналог битового поля на 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(); // переменная которую нужно разбить на биты } }
Я правильно понял ? как правильнее реализовать ? может лучше использовать маршалинг ? Спасибо за ваши ответы


Ответ

Двоеточие применяется для того, чтобы указать размер переменной в битах. Такая запись работает только внутри структур, где несколько небольших значений из 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, которая поможет работать с отдельными битами или группами бит.

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

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