Строение класса bitset. Работа с отдельными битами с применением оператора []

   
На этом шаге мы рассмотрим использование оператора [].

   
Оператор [] может применяться в классе bitset в следующем контексте:

bitset<размер>::reference bitset<размер>::operator[] (size_t idx) 
bool bitset<размер>::operator[] (size_t idx) const

Обе формы возвращают значение бита в позиции idx.

Чтобы возвращаемое значение могло использоваться как модифицируемый объект (l-значение), первая форма для неконстантных
битовых полей использует специальные временные объекты - заместители (proxy). Подробности приводятся далее.

Перед вызовом необходимо убедиться в том, что idx представляет действительный индекс; в противном случае вызов приводит к
непредсказуемым последствиям.

   
При вызове для неконстантных битовых полей оператор [] возвращает специальный временный объект типа bitset<>::reference. Этот
объект используется в качестве заместителя для выполнения некоторых действий с битом, полученным при помощи оператора [].

   Замечание.
Заместители позволяют вьполнять операции с объектами, для которых в обычных условиях такая возможность отсутствует. В частности, они часто
используются для защиты данных. В данном случае заместитель позволяет выполнять с возвращаемым значением некоторые операции битовых полей,
хотя в принципе оно ведет себя как обычный объект типа bool.

   
В частности, для reference определены пять перечисленных ниже операций.

reference& operator= (bool)
Задает значение бита в соответствии с переданной величиной.
reference& operator= (const reference&)
Задает значение бита по другой ссылке.
reference& flip ()
Переводит бит в противоположное состояние.
operator bool () const
Преобразует значение в логическую величину (автоматически).
bool operator~ () const
Возвращает дополнение (противоположное состояние) бита.

   
Примеры выполнения операций с возвращаемым значением оператора []:

bitset<50> flags; 
flags[42] = true;          // Установка бита 42
flags[13] = flags[42];	   // Присваивание значения бита 42 биту 13
flags[42].flip();          // Перевод бита 42 в противоположное состояние 
if (flags[13]) {           // Если бит 13 установлен,
  flags[10] = -flags[42];  // присвоить дополнение бита 42 биту 10
}

   
На следующем шаге мы рассмотрим cоздание модифицированных битовых полей.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий