Страницы

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

среда, 4 декабря 2019 г.

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

#c_sharp #cpp



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


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


Ответы

Ответ 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, которая поможет работать с отдельными битами или группами бит.

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

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