WikiDer > Битовое поле

Bit field

А битовое поле это структура данных используется в компьютерное программирование. Он состоит из ряда смежных память компьютера места, которые были выделены для размещения последовательности биты, хранятся так, чтобы можно было адресовать любой отдельный бит или группу битов в наборе.[1][2] Битовое поле чаще всего используется для представления интегральные типы известной фиксированной разрядности.

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

В микропроцессоры и другие логические устройства, наборы битовых полей, называемые «флагами», обычно используются для управления или для указания промежуточного состояния или результата определенных операций.[4] Микропроцессоры обычно имеют регистр статуса который состоит из таких флагов, используемых для обозначения различных условий после операции, например арифметическое переполнение. Флаги могут быть прочитаны и использованы для принятия решения о последующих операциях, например, при обработке условных инструкции по переходу. Например, JE ... (Перейти, если равно) инструкция в язык ассемблера x86 приведет к скачку, если флаг Z (нулевой) был установлен какой-то предыдущей операцией.

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

Выполнение

Битовые поля могут использоваться для уменьшения потребления памяти, когда программе требуется ряд целочисленных переменных, которые всегда будут иметь низкие значения. Например, во многих системах для хранения целочисленного значения требуется два байта (16 бит) памяти; иногда для сохранения значений требуется всего один или два бита. Наличие у нескольких этих крошечных переменных общего битового поля позволяет эффективно упаковывать данные в памяти.[5]

В C и C ++ собственные битовые поля, определенные реализацией, могут быть созданы с использованием unsigned int, signed int или (в C99 :) _Bool. В этом случае программист может объявить структуру для битового поля, которое маркирует и определяет ширину нескольких подполей.[6] Смежно объявленные битовые поля одного и того же типа могут быть затем упакованы компилятором в меньшее количество слов по сравнению с объемом памяти, используемой, если бы каждое «поле» объявлялось отдельно.

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

Примеры

Язык программирования C

Объявление битового поля в C и C ++:

// непрозрачный и показать#define YES 1#define NO 0// стили линий#define SOLID 1#define DOTTED 2#define DASHED 3// основные цвета#define СИНИЙ 4 /* 100 */#define GREEN 2 /* 010 */#define RED 1 /* 001 */// смешанные цвета#define ЧЕРНЫЙ 0 /* 000 */#define ЖЕЛТЫЙ (КРАСНЫЙ | ЗЕЛЕНЫЙ) /* 011 */#define MAGENTA (КРАСНЫЙ | СИНИЙ) /* 101 */#define CYAN (ЗЕЛЕНЫЙ | СИНИЙ) /* 110 */#define БЕЛЫЙ (КРАСНЫЙ | ЗЕЛЕНЫЙ | СИНИЙ) /* 111 */const char* цвета[8] = {"Чернить", "Красный", "Зеленый", "Желтый", "Синий", "Пурпурный", "Голубой", "Белый"};// свойства поля битового поляструктура BoxProps{  беззнаковый int  непрозрачный       : 1;  беззнаковый int  Цвет заливки   : 3;  беззнаковый int               : 4; // заполняем до 8 бит  беззнаковый int  show_border  : 1;  беззнаковый int  цвет границы : 3;  беззнаковый int  border_style : 2;  беззнаковый char              : 0; // заполняем до ближайшего байта (16 бит)  беззнаковый char ширина        : 4, // Разбиваем байт на 2 поля по 4 бита                высота       : 4;};

[8]

Расположение битовых полей в C структура является определяется реализацией. Для поведения, которое остается предсказуемым для всех компиляторов, может быть предпочтительнее эмулировать битовые поля с помощью примитивных и битовых операторов:

/ * Каждая из этих директив препроцессора определяет один бит,   соответствует одной кнопке на контроллере. Порядок кнопок   соответствует системе Nintendo Entertainment System. * /#define KEY_RIGHT (1 << 0) /* 00000001 */#define KEY_LEFT (1 << 1) /* 00000010 */#define KEY_DOWN (1 << 2) /* 00000100 */#define KEY_UP (1 << 3) /* 00001000 */#define KEY_START (1 << 4) /* 00010000 */#define KEY_SELECT (1 << 5) /* 00100000 */#define KEY_B (1 << 6) /* 01000000 */#define KEY_A (1 << 7) /* 10000000 */int gameControllerStatus = 0;/ * Устанавливает gameControllerStatus с помощью ИЛИ * /пустота KeyPressed( int ключ ) { gameControllerStatus |= ключ; }/ * Отключает ключ в gameControllerStatus с помощью AND и ~ (двоичное НЕ) * /пустота KeyReleased( int ключ ) { gameControllerStatus &= ~ключ; }/ * Проверяет, установлен ли бит с помощью И * /int IsPressed( int ключ ) { возвращаться gameControllerStatus & ключ; }

Регистр статуса процессора

Простой пример битового поля регистр статуса входит в конструкцию восьмибитного 6502 процессор. Одно восьмибитовое поле содержит семь единиц информации:[9]

  • Бит 7. Отрицательный флаг
  • Бит 6. Флаг переполнения
  • Бит 5. Не используется
  • Бит 4. Флаг прерывания
  • Бит 3. Десятичный флаг
  • Бит 2. Флаг запрета прерывания
  • Бит 1. Нулевой флаг
  • Бит 0. Флаг переноса

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

Подмножество флагов в поле флага может быть извлечено с помощью ANDing с маска. Кроме того, большое количество языков, благодаря сдвиг использование оператора (<<) при выполнении степени двойки ((1 << п) оценивает ) возведение в степень, также поддерживают использование сдвиг оператор (<<) в сочетании с И оператор (&) для определения значения одного или нескольких битов.

Предположим, что возвращается байт состояния 103 (десятичный), и что в байте состояния мы хотим проверить 5-й бит флага. Интересующий флаг (буквальная битовая позиция 6) является пятым, поэтому байт маски будет . ANDing статус-байт 103 (0110 0111 в двоичном формате) с байтом маски 32 (0010 0000 в двоичном формате) принимает значение 32, наш исходный байт маски, что означает, что бит флага установлен; в качестве альтернативы, если бы бит флага не был установлен, эта операция была бы оценена как 0.

Таким образом, чтобы проверить пй бит из переменной v, мы можем выполнить операцию:

bool nth_is_set = (v & (1 << п))! = 0; bool nth_is_set = (v >> п) & 1;

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

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

Чтобы немного переключиться, XOR байт состояния и байт маски. Это установит бит, если он очищен, или немного сбросит, если он установлен.

Рекомендации

  1. ^ Пенн Брамм; Дон Брамм (август 1988 г.). Язык ассемблера 80386: полное руководство и библиотека подпрограмм. Группа школьного образования Макгроу-Хилла. п. 606. ISBN 978-0-8306-9047-3.
  2. ^ а б Стив Уаллин (1997). Практическое программирование на C. "O'Reilly Media, Inc.". стр.403–. ISBN 978-1-56592-306-5.
  3. ^ а б Майкл А. Миллер (январь 1992 г.). Семейство микропроцессоров 68000: архитектура, программирование и приложения. Меррилл. п. 323. ISBN 978-0-02-381560-7.
  4. ^ Ян Гриффитс; Мэтью Адамс; Джесси Либерти (30 июля 2010 г.). Программирование на C # 4.0: создание приложений Windows, Web и RIA для .NET 4.0 Framework. "O'Reilly Media, Inc.". С. 81–. ISBN 978-1-4493-9972-6.
  5. ^ Тибет Мимар (1991). Программирование и проектирование с семейством 68000: включая 68000, 68010/12, 68020 и 68030. Прентис Холл. п. 275. ISBN 978-0-13-731498-0.
  6. ^ Прата, Стивен (2007). C праймер плюс (5-е изд.). Индианаполис, Индиана: Sams. ISBN 0-672-32696-5.
  7. ^ Марк Э. Даггетт (13 ноября 2013 г.). Эксперт по JavaScript. Апресс. С. 68–. ISBN 978-1-4302-6097-4.
  8. ^ Прата, Стивен (2007). C праймер плюс (5-е изд.). Индианаполис, Индиана: Sams. ISBN 0-672-32696-5.
  9. ^ InCider. W. Green. Январь 1986. с. 108.

Смотрите также

внешняя ссылка