Класс-контейнер 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; }
Пример работы программы
00100111 11111111 11011000 --------------- 11100000 00011100 --------------- 11011000 0 1