Jump to content

Бит поля

(Перенаправлен из битового поля )

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

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

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

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

Выполнение

[ редактировать ]

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

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

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

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

[ редактировать ]

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

// opaque and show
#define YES 1
#define NO  0

// line styles
#define SOLID  1
#define DOTTED 2
#define DASHED 3

// primary colors
#define BLUE  0b100
#define GREEN 0b010
#define RED   0b001

// mixed colors
#define BLACK   0
#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] = {"Black", "Red", "Green", "Yellow", "Blue", "Magenta", "Cyan", "White"};

// bit field box properties
struct BoxProps
{
  unsigned int  opaque       : 1;
  unsigned int  fill_color   : 3;
  unsigned int               : 4; // fill to 8 bits
  unsigned int  show_border  : 1;
  unsigned int  border_color : 3;
  unsigned int  border_style : 2;
  unsigned char              : 0; // fill to nearest byte (16 bits)
  unsigned char width        : 4, // Split a byte into 2 fields of 4 bits
                height       : 4;
};


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

/* Each of these preprocessor directives defines a single bit,
   corresponding to one button on the controller.  
   Button order matches that of the 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
#define KEY_B      0b01000000
#define KEY_A      0b10000000

unsigned char gameControllerStatus = 0;

/* Sets the gameControllerStatus using OR */
void KeyPressed(unsigned char key) 
{ 
  gameControllerStatus |= key; 
}

/* Clears the gameControllerStatus using AND and ~ (binary NOT)*/
void KeyReleased(unsigned char key) 
{ 
  gameControllerStatus &= ~key; 
}

/* Tests whether a bit is set using AND */
unsigned char IsPressed(unsigned char key) 
{ 
  return gameControllerStatus & key; 
}

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

[ редактировать ]

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

6502 Регистр статуса
Бит 7 Бит 6 Бит 5 Бит 4 Бит 3 Бит 2 Бит 1 Бит 0
N Egative Flag o v erflow flag - B Reak Flag D Ecimal Flag Я неразрыв флаг Z ero flag C Arry Flag

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

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

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

[ редактировать ]

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

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

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

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

Изменение кусочков в флага словах

[ редактировать ]

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

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

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

[ редактировать ]
  • Двоичный код - кодирование данных, используя 0s и 1s
  • БИТ-БАНКА -Группа 32-битных процессоров RISC
  • Битборд - Структура данных, обычно используемая в компьютерных системах, которые играют
  • Бит -массив - структура данных массива, которая компактно хранит биты
  • Флаг (программирование) - переменная компьютерных данных
  • Слово (компьютерная архитектура) - блок базовой памяти, обрабатываемый компьютером
  • Маска (вычисления) - данные, используемые для битовых операций
  • Слово статуса программы - Регистр управления в IBM System/360 и преемники системных
  • Регистр состояния - регистр, содержащий флаги, предоставляющие дополнительную информацию о результате в процессоре
  • Регистр флагов (вычисления) - Регистр статуса
  • Регистр управления - регистр процессора, который изменяет или контролирует общее поведение ЦП

Примечания

[ редактировать ]
  1. ^ В C, это определяется реализацией, подписано ли бит типа int или неподписан. В C ++ он всегда подписан в соответствии с базовым типом.
  1. ^ Пенн Брамм; Дон Брамм (август 1988 г.). 80386 Язык Ассамблеи: полная учебная и подпрограмма библиотека . McGraw-Hill School Education Group. п. 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 . "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 -е изд.). Индианаполис, Индиана: Самс. 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
Номер скриншота №: 768cb43543f2e49d03844898180af809__1722260400
URL1:https://arc.ask3.ru/arc/aa/76/09/768cb43543f2e49d03844898180af809.html
Заголовок, (Title) документа по адресу, URL1:
Bit field - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)