19.8.1. Битовые поля
Класс может определить (нестатическую) переменную-член как битовое поле (bit-field). Битовое поле хранит определенное количество битов. Обычно битовые поля используются при необходимости передать двоичные данные другой программе или аппаратному устройству.
Расположение в памяти битовых полей зависит от конкретной машины.
У битового поля должны быть целочисленный тип или тип перечисления (см. раздел 19.3). Для битового поля обычно используют беззнаковый тип, поскольку поведение битового поля знакового типа зависит от реализации. Чтобы объявить член класса битовым полем, после его имени располагают двоеточие и константное выражение, указывающее количество битов:
typedef unsigned int Bit;
class File {
Bit mode: 2; // mode имеет 2 бита
Bit modified: 1; // modified имеет 1 бит
Bit prot_owner: 3; // prot_owner имеет 3 бита
Bit prot_group: 3; // prot_group имеет 3 бита
Bit prot_world: 3; // prot_world имеет 3 бита
// функции и переменные-члены класса File
public:
// режимы файла определены как восьмеричные
// литералы; см. p. 2.1.3
enum modes { READ = 01, WRITE = 02, EXECUTE = 03 };
File &open(modes);
void close();
void write();
bool isRead() const;
void setWrite();
}
Битовое поле mode имеет размер в два бита, битовое поле modified — только один, а другие — по три бита. Битовые поля, определенные в последовательном порядке в теле класса, если это возможно, упаковываются в смежных битах того же целого числа. Таким образом достигается уплотнение хранилища. Например, пять битовых полей в приведенном выше объявлении будут сохранены в одной переменной типа unsigned int, ассоциированной с первым битовым полем mode. Способ упаковки битов в целое число зависит от машины.
К битовому полю не может быть применен оператор обращения к адресу (&), поэтому не может быть никаких указателей на битовые поля классов.
Для битовых полей обычно лучше подходит беззнаковый тип. Поведение битовых полей, хранимых в переменной знакового типа, определяет конкретная реализация.
Использование битовых полей
К битовым полям обращаются так же, как и к другим переменным-членам класса:
void File::write() {
modified = 1;
// ...
}
void File::close() {
if (modified)
// ... сохранить содержимое
}
Для манипулирования битовыми полями с несколькими битами обычно используют встроенные побитовые операторы (см. раздел 4.8):
File &File::open(File::modes m) {
mode |= READ; // установить бит READ по умолчанию
// другая обработка
if (m & WRITE) // если открыто для чтения и записи
// процесс открытия файла в режиме чтения/записи
return *this;
}
Классы, определяющие члены битовых полей, обычно определяют также набор встраиваемых функций-членов для проверки и установки значений битовых полей:
inline bool File::isRead() const { return mode & READ; }
inline void File::setWrite() { mode |= WRITE; }
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОК