Битовое поле

редактировать
Структура данных, используемая в компьютерном программировании

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

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

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

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

Содержание
  • 1 Реализация
  • 2 Примеры
    • 2.1 Язык программирования C
    • 2.2 Регистр состояния процессора
    • 2.3 Извлечение битов из слов флагов
    • 2.4 Изменение битов в словах флагов
  • 3 Ссылки
  • 4 См. Также
  • 5 Внешние ссылки
Реализация

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

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

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

Примеры

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

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

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

Расположение битовых полей в структуре 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; /* Sets the gameControllerStatus using OR */ void KeyPressed( int key) { gameControllerStatus |= key; } /* Turns the key in gameControllerStatus off using AND and ~ (binary NOT)*/ void KeyReleased( int key) { gameControllerStatus = ~key; } /* Tests whether a bit is set using AND */ int IsPressed( int key) { return gameControllerStatus key; }

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

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

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

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

Подмножество флагов в поле флага может быть извлечено с помощью И с маской. Кроме того, большое количество языков, из-за возведения в степень оператора shift (<<) use in performing power-of-two ((1 << n)оценивается как 2 n {\ displaystyle 2 ^ {n}}2 ^ {n} ), также поддерживает использование оператора shift (оператор <<) in combination with the AND () для определения значения одного или нескольких битов.

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

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

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

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

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

Чтобы переключить бит, 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 primer plus (5-е изд.). Индианаполис, Индиана: Sams. ISBN 0-672-32696-5.
  7. ^Марк Э. Даггетт (13 ноября 2013 г.). Эксперт по JavaScript. Апресс. С. 68–. ISBN 978-1-4302-6097-4.
  8. ^Прата, Стивен (2007). C primer plus (5-е изд.). Индианаполис, Индиана: Sams. ISBN 0-672-32696-5.
  9. ^InCider. W. Green. Январь 1986. с. 108.
См. Также
Внешние ссылки
Последняя правка сделана 2021-05-12 08:25:23
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте