Перегрузка побитовых операторов C++

Опубликовано: 19 Февраля, 2023

Предпосылки:

  • Перегрузка оператора
  • Побитовый оператор в C/C++

Всего в C++ существует шесть побитовых операторов. Шесть побитовых операторов: побитовое И (&), побитовое ИЛИ (|), побитовое исключающее ИЛИ (^), сдвиг влево (<<), сдвиг вправо (>>) и побитовое НЕ (~).

  • & (побитовое И) в C++ принимает два числа в качестве операндов и выполняет И с каждым битом двух чисел. Результат И равен 1, только если оба бита равны 1.
  • | (побитовое ИЛИ) в C++ принимает два числа в качестве операндов и выполняет операцию ИЛИ для каждого бита двух чисел. Результат операции ИЛИ равен 1, если любой из двух битов равен 1.
  • ^ (побитовое XOR) в C++ принимает два числа в качестве операндов и выполняет XOR для каждого бита двух чисел. Результат XOR равен 1, если два бита различны.
  • << (сдвиг влево) в C++ принимает два числа, сдвиг влево сдвигает биты первого операнда, а второй операнд определяет количество мест для сдвига.
  • >> (сдвиг вправо) в C++ принимает два числа, сдвигает вправо биты первого операнда, а второй операнд определяет количество мест для сдвига.
  • ~ (побитовое НЕ) в C++ принимает одно число и инвертирует все его биты.

Почему оператор перегружается?

Мы не можем напрямую использовать побитовый оператор для объектов. Простое объяснение этого состоит в том, что битовый оператор предопределен для работы только со встроенными типами данных. Поскольку класс и объекты являются пользовательскими типами данных, компилятор выдает ошибку.

Пример:

int a = 1, b=0;
int c= a & b;

cout<<c<<endl;

Выход:

0 

здесь a и b имеют тип integer, который является встроенным типом данных. Побитовый оператор можно использовать непосредственно со встроенными типами данных.

class C
{
};
int main() 
{
   C c1(1), c2(0);
   c3=c1 & c2;
   return 0;
}

c1 и c2 — переменные типа «класс C». Здесь компилятор выдаст ошибку, поскольку мы пытаемся использовать побитовый оператор для пользовательских типов данных.

В приведенном выше примере можно реализовать методы или функции внутри класса, но вместо этого мы выбираем перегрузку операторов. Причина этого в том, что перегрузка оператора дает функциональность для прямого использования оператора, что делает код простым для понимания, и из-за этого даже уменьшается размер кода. Кроме того, перегрузка оператора не влияет на нормальную работу оператора, но предоставляет ему дополнительную функциональность.

Побитовая перегрузка оператора

Теперь, если пользователь хочет использовать побитовый оператор между объектами класса, он должен переопределить значение побитового оператора. Переопределение значения операторов на самом деле не меняет их первоначального значения, вместо этого им придается дополнительное значение наряду с существующими.

Пример 1:

Пример 2:

Пример 3:

Пример 4:

Пример 5:

Пример 6: