~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 562BE342D5398E1C46533469AF512A86__1706605980 ✰
Заголовок документа оригинал.:
✰ Bit field - Wikipedia ✰
Заголовок документа перевод.:
✰ Битовое поле — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Bit_field ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/56/86/562be342d5398e1c46533469af512a86.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/56/86/562be342d5398e1c46533469af512a86__translat.html ✰
Дата и время сохранения документа:
✰ 13.06.2024 17:56:34 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 30 January 2024, at 12:13 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Битовое поле — Википедия Jump to content

Битовое поле

Из Википедии, бесплатной энциклопедии

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

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

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

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

Реализация [ править ]

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

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

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

Примеры [ править ]

Язык программирования C [ править ]

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

// непрозрачность и отображение 
 #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 BLACK 0  /* 000 */ 
 #define YELLOW (RED | GREEN)  /* 011 */ 
 #define MAGENTA (RED | BLUE)  /* 101 */ 
 #define CYAN (GREEN | BLUE)  /* 110 */ 
 #define WHITE (RED | GREEN | BLUE)  /* 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 бита 
                 высотой         :   4  ; 
  }; 


Расположение битовых полей в 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 
 0b10000000 
 #define KEY_B 0b 01000000 #define KEY_A 

 беззнаковый   символ   gameControllerStatus   =   0  ; 

  /* Устанавливает gameControllerStatus с помощью OR */ 
 void   KeyPressed  (  беззнаковый   символьный   ключ  )  
 {  
   gameControllerStatus   |=   key  ;  
  } 

 /* Очищает gameControllerStatus с помощью AND и ~ (двоичное NOT)*/ 
 void   KeyReleased  (  беззнаковый   символьный   ключ  )  
 {  
   gameControllerStatus   &=   ~  key  ;  
  } 

 /* Проверяет, установлен ли бит с помощью AND */ 
 unsigned   char   IsPressed  (  unsigned   char   key  )  
 {  
   return   gameControllerStatus   &   key  ;  
  } 

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

Регистр состояния процессора представляет собой битовое поле, состоящее из нескольких битов флагов. Каждый бит флага описывает информацию о текущем состоянии процессора. [8] регистр состояния процессора 6502 В качестве примера ниже показан :

6502 регистр статуса
Бит 7 Бит 6 Бит 5 Бит 4 Бит 3 Бит 2 Бит 1 Бит 0
Отрицательный флаг o Флаг переполнения - Взлом флага Десятичный флаг Я прерываю-отключаю флаг нулевого нуля Флаг Нести флаг

Эти биты устанавливаются процессором по результатам операции. Определенными битами (такими как флаги Carry, Interrupt-disable и Decimal) можно явно управлять с помощью инструкций установки и очистки. Кроме того, определены инструкции ветвления для изменения выполнения в зависимости от текущего состояния флага.

Например, после ADC (Добавить с переносом), BVS Инструкция (переход по набору oVerflow) может использоваться для перехода в зависимости от того, был ли флаг переполнения установлен процессором после результата инструкции сложения.

Извлечение битов из слов-флажков [ править ]

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

Если байт состояния устройства равен 0x67, а 5-й бит флага указывает на готовность данных. Байт маски 2^5 = 0x20. Операция AND для байта состояния 0x67 ( 0110 0111 в двоичном формате) с байтом маски 0x20( 0010 0000в двоичном формате) оценивается как 0x20. Это означает, что бит флага установлен, т. е. устройство готово к передаче данных. Если бы бит флага не был установлен, он был бы равен 0, т. е. от устройства нет доступных данных.

Чтобы проверить n -й бит переменной v , выполните одно из следующих действий: (оба эквивалентны)

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

Изменение битов в словах-флажках [ править ]

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

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

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

Примечания [ править ]

  1. ^ В C реализация определяет, является ли битовое поле типа int знаковым или беззнаковым. В C++ он всегда имеет подпись, соответствующую базовому типу.

Ссылки [ править ]

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

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

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: 562BE342D5398E1C46533469AF512A86__1706605980
URL1:https://en.wikipedia.org/wiki/Bit_field
Заголовок, (Title) документа по адресу, URL1:
Bit field - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)