Бит поля
Поле бита - это структура данных , которая отображается на один или несколько соседних битов , которые были выделены для конкретных целей, так что любой один бит или группу битов в структуре могут быть установлены или проверены. [ 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;
}
![]() | Эта статья может потребовать очистки Википедии для соответствия стандартам качества . Конкретная проблема: перемещена с поля флага . ( Май 2016 г. ) |
Регистр статуса процессора
[ редактировать ]Реестр статуса процессора представляет собой битское поле, состоящее из нескольких флагов. Каждый бит флага описывает информацию о текущем состоянии процессора. [ 8 ] В качестве примера, регистр состояния процессора 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 и преемники системных
- Регистр состояния - регистр, содержащий флаги, предоставляющие дополнительную информацию о результате в процессоре
- Регистр флагов (вычисления) - Регистр статуса
- Регистр управления - регистр процессора, который изменяет или контролирует общее поведение ЦП
Примечания
[ редактировать ]- ^ В C, это определяется реализацией, подписано ли бит типа int или неподписан. В C ++ он всегда подписан в соответствии с базовым типом.
Ссылки
[ редактировать ]- ^ Пенн Брамм; Дон Брамм (август 1988 г.). 80386 Язык Ассамблеи: полная учебная и подпрограмма библиотека . McGraw-Hill School Education Group. п. 606. ISBN 978-0-8306-9047-3 .
- ^ Подпрыгнуть до: а беременный Стив Оуаллин (1997). Практическое программирование C. "O'Reilly Media, Inc.". С. 403 -. ISBN 978-1-56592-306-5 .
- ^ Подпрыгнуть до: а беременный Майкл А. Миллер (январь 1992 г.). Семейство микропроцессоров 68000: архитектура, программирование и приложения . Меррилл. п. 323. ISBN 978-0-02-381560-7 .
- ^ Ян Гриффитс; Мэтью Адамс; Джесси Либерти (30 июля 2010 г.). Программирование C# 4.0: Создание приложений Windows, Web и RIA для фреймворка .NET 4.0 . "O'Reilly Media, Inc.". С. 81–. ISBN 978-1-4493-9972-6 .
- ^ Тибет Мимар (1991). Программирование и проектирование с семейством 68000: в том числе 68000, 68010/12, 68020 и 68030 . Прентис Холл. п. 275. ISBN 978-0-13-731498-0 .
- ^ Подпрыгнуть до: а беременный Прата, Стивен (2007). C Primer Plus (5 -е изд.). Индианаполис, Индиана: Самс. ISBN 978-0-672-32696-7 .
- ^ Марк Э. Даггетт (13 ноября 2013 г.). Эксперт JavaScript . Просо стр. 68–. ISBN 978-1-4302-6097-4 .
- ^ Заклинание . В. Грин. Январь 1986 г. с. 108
Внешние ссылки
[ редактировать ]- Объяснение из книги
- Описание из другой вики
- Использование варианта в руководстве C ++
- C ++ Библиотека битов либбита ( альтернативный URL )
- Bit Twiddling Hacks : несколько фрагментов C -кода манипулируют битами.