Введение
Битовое поле — это структура данных, состоящая из одного или нескольких смежных битов, выделенных для определенных целей, позволяющая устанавливать или проверять состояние любого отдельного бита или группы битов в структуре. Битовые поля чаще всего используются для представления целочисленных типов известной фиксированной битовой ширины, таких как однобитовые логические значения. Значение отдельных битов в поле определяется программистом; например, первый бит в битовом поле (расположенный по базовому адресу поля) иногда используется для определения состояния определенного атрибута, связанного с этим полем. В процессорах и других логических устройствах коллекции битовых полей, называемые флагами, обычно используются для управления или индикации результата определенных операций. Процессоры имеют регистр состояния, состоящий из флагов. Например, если результат сложения не может быть представлен в целевом регистре, устанавливается флаг арифметического переполнения. Флаги могут использоваться для определения последующих операций, таких как инструкции условного перехода. Например, инструкция JE (Jump if Equal) в ассемблере x86 приведет к переходу, если флаг Z (нуль) был установлен предыдущей операцией. Битовое поле отличается от битового массива тем, что последний используется для хранения большого набора битов, индексированных целыми числами, и часто шире, чем любой целочисленный тип, поддерживаемый языком. Битовые поля, напротив, обычно помещаются в машинное слово. В C нативные битовые поля могут быть созданы с использованием типов int, unsigned int, signed int, Bool (в C99), BitInt(N), unsigned BitInt(N) (в C23) или других типов, определенных реализацией. В C++ они могут быть созданы с использованием любого целочисленного или перечислительного типа; большинство компиляторов C также допускают это. В этом случае программист может объявить структуру для битового поля, которая задает имена и ширину нескольких подполей. Смежно объявленные битовые поля одного и того же типа могут быть упакованы компилятором в меньшее количество слов по сравнению с объемом памяти, необходимым, если бы каждое "поле" было объявлено отдельно. Для языков, не имеющих встроенных битовых полей, или если программист хочет контролировать результирующее битовое представление, можно вручную манипулировать битами в более крупном типе слова. В этом случае программист может устанавливать, проверять и изменять биты в поле, используя комбинации маскирования и побитовых операций.
A bit field is a data structure that consists of one or more adjacent bits which have been allocated for specific purposes, so that any single bit or group of bits within the structure can be set or inspected. A bit field is most commonly used to represent integral types of known, fixed bit width, such as single bit Booleans. The meaning of the individual bits within the field is determined by the programmer; for example, the first bit in a bit field (located at the field's base address) is sometimes used to determine the state of a particular attribute associated with the bit field. Within CPUs and other logic devices, collections of bit fields called flags are commonly used to control or to indicate the outcome of particular operations. Processors have a status register that is composed of flags. For example, if the result of an addition cannot be represented in the destination an arithmetic overflow is set. The flags can be used to decide subsequent operations, such as conditional jump instructions. For example, a JE (Jump if Equal) instruction in the x86 assembly language will result in a jump if the Z (zero) flag was set by some previous operation. A bit field is distinguished from a bit array in that the latter is used to store a large set of bits indexed by integers and is often wider than any integral type supported by the language. Bit fields, on the other hand, typically fit within a machine word,
In C, native implementation defined bit fields can be created using int, unsigned int, signed int, Bool (in C99), BitInt(N), unsigned BitInt(N) (in C23) or other implementation defined types. In C++, they can be created using any integral or enumeration type; most C compilers also allow this. In this case, the programmer can declare a structure for a bit field which labels and determines the width of several subfields. Adjacently declared bit fields of the same type can then be packed by the compiler into a reduced number of words, compared with the memory used if each 'field' were to be declared separately. For languages lacking native bit fields, or where the programmer wants control over the resulting bit representation, it is possible to manually manipulate bits within a larger word type. In this case, the programmer can set, test, and change the bits in the field using combinations of masking and bitwise operations.
Изменение битов в флаге слов
Запись, чтение или изменение битов в флагах можно выполнять только с помощью операций OR, AND и NOT – операций, которые процессор может выполнять быстро. Чтобы установить бит, выполните операцию OR между байтом статуса и байтом маски. Любые биты, установленные в байте маски или байте статуса, будут установлены в результирующем байте. Чтобы изменить бит, выполните операцию XOR между байтом статуса и байтом маски. Это установит бит, если он был сброшен, или сбросит бит, если он был установлен.