Битовое поле

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:09, 14 декабря 2017.

Битовое поле – это элемент структуры, определенный как некоторое число битов, обычно меньшее, чем число битов в целом числе (оно по величине не превосходит машинного слова и зависит от реализации компилятора). Они предназначены для экономного размещения в памяти данных небольшого диапазона, обеспечивают удобный доступ к отдельным битам данных. Кроме того, с помощью битовых полей можно формировать объекты с длиной внутреннего представления, не кратной байту. Битовые поля обычно применяются в низкоуровневом программировании.[Источник 1]

Значение отдельных битов в поле определяется программистом, например, первый бит в битовое поле (расположенном в поле базового адреса) иногда используется для определения состояния конкретного атрибута, связанного с битовым полем.

В микропроцессорах и других логических устройств, наборы бит поля "флаги" обычно используются для контроля или для обозначения промежуточного состояния или результатов конкретной деятельности. Микропроцессоры, как правило, имеют статус регистра, который состоит из таких флагов, используемые для обозначения различных состояния после операций, например, арифметическое переполнение. Флаги можно прочитать и используются для принятия решения о последующих операциях, например, при обработке условного скачка инструкции. Например, je (перейти если равно) инструкция на х86 ассемблере в результате скачка если Z (ноль) флаг был установлен на некоторую предыдущую операцию.

Битовое поле отличается от битового массива тем, что последний используется для хранения большой набор битов, пронумерованных целыми числами и часто шире, чем любой целочисленный тип поддерживаемых языков. Битовые поля, с другой стороны, как правило, помещается в машину, слово, и денотата бит не зависит от их числовым индексом.

Применение

Битовые поля могут использоваться для уменьшения потребления памяти, когда программа требует ряд целочисленных переменных, которые всегда будут иметь низкие значения. Например, во многих системах хранения целочисленное значение требуется два байта (16 бит) памяти; иногда значения будут храниться только в одном или двух битах. Имея некоторые из этих крошечных переменные битового поля позволяет эффективно упаковывать данные в памяти. В C и C++, собственной реализации определенных битовые поля могут быть созданы, используя беззнаковый int, подписанный int, или (в c99:) _Bool. В этом случае, программист может объявить структуру битового поля метки и определяет ширину из нескольких подполей. При заявленной битовые поля того же типа могут быть упакованы компилятор в меньшее количество слов, по сравнению с памятью используется если в каждом "поле" будет объявлена отдельно. Для языков, не хватает родных полей, или где программист хочет строго контролировать результирующий бит представлении, можно вручную манипулировать битами в рамках более крупного типа Word. В этом случае программист может установить, проверить и изменить биты в поле с помощью комбинации маскировки и побитовые операции.

Компиляторы

Операции которые компиляторы могут произвести с битовыми полями довольно ограничены. Компиляторы способны лишь произвести чтение значения из битового поля, а также запись в битовое поле. Компиляторы распознают битовое поле как число без знака. Аппаратная платформа и тип компилятора прямо влияет на расположение битовых полей в структуре данных: в зависимости от реализации компилятора расположение битовых полей может начинаться с младших или старших битов.[Источник 2]

Объявление битовых полей

Элементом структуры может быть битовое поле, обеспечивающее доступ к отдельным битам памяти. Вне структур или объединений битовые поля объявлять нельзя. Нельзя также организовывать массивы битовых полей и нельзя применять к полям операцию определения адреса или получить ссылку на них.

Синтаксис объявления типа структуры с битовыми полями:

struct [ИмяСтруктуры] { Тип1 ИмяПоля1 : ШиринаПоля1
Тип2 ИмяПоля2 : ШиринаПоля2
 ........................
ТипN ИмяПоляN : ШиринаПоляN
} ИмяСтруктуры;

где struct – спецификатор типа;

ИмяСтруктуры – идентификатор; Тип1, ... ТипN – тип поля, который может быть только int, возможно, со спецификатором unsigned или signed ; ШиринаПоля (длина) – целое неотрицательное десятичное число, значение которого обычно (в зависимости от реализации компилятора) не должно превышать длины машинного слова. Например:

struct {
int c1 : 4; 
int c2 : 12; 
} ab;

Битовые поля длиной 1 должны объявляться как unsigned, поскольку 1 бит не может иметь знака. Битовые поля могут иметь длину от 1 до 16 бит для 16-битных сред и от 1 до 32 бит для 32-битных сред.

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

Например, если нам нужны только биты cts и dsr, то можно объявить структуру status_type следующим образом:

struct status_type {
                    unsigned : 4; 
                    unsigned cts :1; 
                    unsigned dsr :4; 
                   } status;

[Источник 3]

Регистр состояния процессора

Простой пример регистра состояния битового поля включен в конструкцию восьмибитового процессора 6502. В одном восьмибитовом поле хранилось семь фрагментов информации: Bit 7. Навигационный флаг Bit 6. Флаг переполнения Bit 5. Неиспользованный Bit 4. флаг перерыва Bit 3. десятичный флаг Bit 2. флаг применения-отключения Bit 1. флаг переноса Bit 0. Нулевой флаг

Unix код выхода процесса

Другим примером может служить системы Unix статус выхода код, который может быть использован в качестве флага для передачи информации о состоянии в другой процесс. Например, программа, которая контролирует состояние восьми переключателей охранной сигнализации может установить биты в код выхода, проходя по другому обрабатывая информацию о том, какие выключатели закрытые или открытые.

Изменение битов в словах флагов

Запись, чтение или переключение битов во флагах можно выполнять только с использованием операций OR, AND и NOT - операций, которые могут быть быстро выполнены в процессоре. Установка бит, или байта состояния с байтом маски. Любые биты, установленные в байте маски или бите состояния, будут установлены в результате этого. Чтобы переключить бит, XOR - байт статуса и байт маски. Это немного изменит, если оно будет очищено или очищено, если оно установлено.

Источники

  1. Битовое поле // Wikipedia. [1998-2017]. URL: https://ru.wikipedia.org/wiki/Битовое_поле (дата обращения: 16.11.2017)
  2. Bit field // Wikipedia. [1998-2017]. URL: https://en.wikipedia.org/wiki/Bit_field (дата обращения: 16.11.2017)
  3. Битовое поле // intuit. [2008-2017]. URL: http://www.intuit.ru/studies/courses/648/504/lecture/11442 (дата обращения: 16.11.2017)