Из Википедии, бесплатной энциклопедии
  (Перенаправлено из поля флага )
Перейти к навигации Перейти к поиску

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

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

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

Битовое поле отличается от битового массива тем, что последний используется для хранения большого набора битов, индексированных целыми числами, и часто шире, чем любой интегральный тип, поддерживаемый языком. [ Править ] Битовые поля, с другой стороны, как правило , подходят в пределах машинного слова , [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 BLUE 0b100 #define GREEN 0b010 #define RED 0b001// смешанные цвета #define ЧЕРНЫЙ 0 / * 000 * /#define ЖЕЛТЫЙ (КРАСНЫЙ | ЗЕЛЕНЫЙ) / * 011 * /#define ПУРПУРНЫЙ (КРАСНЫЙ | СИНИЙ) / * 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 ; };

[8]

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

/ * Каждая из этих директив препроцессора определяет один бит,  соответствующий одной кнопке на контроллере.  Порядок кнопок соответствует порядку в системе Nintendo Entertainment System. * / #define KEY_RIGHT 0b00000001 #define KEY_LEFT 0b00000010 #define KEY_DOWN 0b00000100 #define KEY_UP 0b00001000 #define KEY_START 0b00010000 #define KEY_SELECT 0b00100000 # define100KEY_A0int  gameControllerStatus  =  0 ;/ * Устанавливает gameControllerStatus с помощью ИЛИ * / void  KeyPressed (  int  key  )  {  gameControllerStatus  | =  key ;  }/ * Отключает ключ в gameControllerStatus с помощью AND и ~ (двоичное НЕ) * / void  KeyReleased (  int  key  )  {  gameControllerStatus  & =  ~ key ;  }/ * Проверяет, установлен ли бит с помощью И * / int  IsPressed (  int  key  )  {  return  gameControllerStatus  &  key ;  }

Регистр состояния процессора [ править ]

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

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

Извлечение битов из флаговых слов [ править ]

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

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

Таким образом, чтобы проверить 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. ^ a b Стив Уаллин (1997). Практическое программирование C . "O'Reilly Media, Inc.". С.  403 -. ISBN 978-1-56592-306-5.
  3. ^ a b Майкл А. Миллер (январь 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 978-0-672-32696-7.
  7. ^ Марк Э. Даггетт (13 ноября 2013 г.). Эксперт по JavaScript . Апресс. С. 68–. ISBN 978-1-4302-6097-4.
  8. ^ Прата, Стивен (2007). C primer plus (5-е изд.). Индианаполис, Индиана: Sams. ISBN 978-0-672-32696-7.
  9. ^ InCider . W. Green. Январь 1986. с. 108.

См. Также [ править ]

  • Бинарный код
  • Битборд , используемый в шахматах и ​​подобных играх.
  • Битовый массив (или битовая строка)
  • Word (компьютерная архитектура)
  • Маска (вычисление)
  • Слово состояния программы
  • Регистр статуса
  • Регистр FLAGS (вычислительный)
  • Контрольный регистр

Внешние ссылки [ править ]

  • Объяснение из книги
  • Описание из другой вики
  • Пример использования в руководстве по C ++
  • Библиотека битов C ++ libbit ( альтернативный URL )