Перегруженные операторы класса bitset

Класс-контейнер bitset поддерживает различные наборы операторов, которые позволяют упростить работу с объектами этого типа. Например, в классе перегружены логические операторы: AND, OR, XOR, NOT  для поддержки битовых операций, с последующим присваиванием результата.

//побитовые операции 
bitset<_Nb>& operator&=  (const bitset<_Nb>& __rhs); // AND, присвоение
bitset<_Nb>& operator|=  (const bitset<_Nb>& __rhs); // OR, присвоение
bitset<_Nb>& operator^=  (const bitset<_Nb>& __rhs); // XOR, присвоение
bitset<_Nb>  operator~   () const;                   // NOT

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

//глобальные функции побитовых операций
template<size_t _Nb>
inline bitset<_Nb> operator&(const bitset<_Nb>& __x, const bitset<_Nb>& __y);
template<size_t _Nb>
inline bitset<_Nb> operator|(const bitset<_Nb>& __x, const bitset<_Nb>& __y);
template <size_t _Nb>
inline bitset<_Nb> operator^(const bitset<_Nb>& __x, const bitset<_Nb>& __y);

Для сдвига битовых комбинаций на n-позиций в классе перегружены следующие операторы:

// перегруженные операторы сдвига битов влево и вправо, соответственно
bitset<_Nb> operator<< (size_t __position) const; 
bitset<_Nb> operator>> (size_t __position) const;
bitset<_Nb>& operator<<= (size_t __position);    // побитовая операция сдвига влево, присвоение
bitset<_Nb>& operator>>= (size_t __position);    // побитовая операция сдвига вправо, присвоение

Битовые комбинации можно сравнивать, и по этому поводу, в контейнере bitset перегружены два оператора сравнения: равно и неравно:

bool operator== (const bitset<_Nb>& __rhs) const;
bool operator!= (const bitset<_Nb>& __rhs) const;

Для непосредственного извлечения объектов bitset из потока в заголовочном файле bitset определены функции перегрузки глобальных операторов извлечения и помещения в потоки ввода/вывода.

//глобальные операторы ввода/вывода
template<class _CharT, class _Traits, size_t _Nb>
std::basic_istream<_CharT, _Traits>&
operator>>(std::basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x);
template <class _CharT, class _Traits, size_t _Nb>
std::basic_ostream<_CharT, _Traits>&
operator<<(std::basic_ostream<_CharT, _Traits>& __os, const bitset<_Nb>& __x);

Совокупность всех вышеперечисленных перегруженных операторов составляет логику побитовых операций bitset контейнера для работы с основными типами данных.

Параметры

  • __x
    Левосторонний bitset объект (глобальные функции). Он должен состоять из такого же количества битов, как и  правосторонний bitset объект (т.е. с тем же параметром шаблона _Nb).
  • __y
    Правосторонний bitset объект  в глобальных функциях, имеет тот же смысл, что и параметр __rhs.
  • __rhs
    Правосторонний bitset объект. Используется в методах класса, он должен состоять из такого же количества битов, как и  левосторонний bitset объект.
  •  __position
    количество позиций, на которое необходимо сдвинуть биты. 
  • __is
    istream объект для организации потокового ввода объекта bitset.
  • __os
    ostream объект для организации потокового вsвода объекта bitset

Возвращаемое значение

Для функций-членов класса bitset:

  • указатель на объект bitset (*this);
  • логическое значение, если выполняется сравнение.

Для глобальных функций:

  • левосторонний объект bitset;
  • объект istream;
  • объект ostream.

Пример: исходный код программы

// перегруженные операторы класса-контейнера bitset

#include <iostream>
#include <string>
#include <bitset>
using namespace std;

int main ()
{
  bitset<8> byte1 (string("11111111"));
  bitset<8> byte2 (string("00100111"));

  cout << (byte1 & byte2) << endl    // 00100111
       << (byte1 | byte2) << endl    // 11111111
       << (byte1 ^ byte2) << endl;   // 11011000

  cout << "---------------\n";

  cout << (byte1<<=5) << endl;       // 11100000 сдвиг битов влево с присваиванием результата
  cout << (byte1>>=3) << endl;       // 00011100 сдвиг битов вправо с присваиванием результата

  cout << "---------------\n";

  cout << (~byte2) << endl;          // 11011000 отрицание

  cout << (byte1 == byte2) << endl;    // false (00011100 == 00100111)
  cout << (byte1 != byte2) << endl;    // true  (00011100 != 00100111)
  return 0;
}

Пример работы программы

CppStudio.com
00100111
11111111
11011000
---------------
11100000
00011100
---------------
11011000
0
1
Автор: Marienko L.
Дата: 08.02.2013
Поделиться:

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

Вы должны войти, чтобы оставить комментарий.