Реализовать для каждого класса деструктор и три конструктора: без аргументов, копирования и инициализации. (фулл задание ниже)

Помогите, пожалуйста, с решением данной задачи. Уже пару дней над ней ломаю голову, никак не могу ее решить. Реализовать класс Binary для работы с двоичными числами. В классе должно быть одно поле – число в двоичной форме записи. Требуется реализовать операции: сдвиг влево на заданное количество битов, сдвиг вправо на заданное количество битов, логические операции (and, or, xor, not).


Ответы (1 шт):

Автор решения: VladimirS
template<typename underlying_numeric_type>
class Binary {
public:
   // Конструкторы и присвоение:
   Binary(underlying_numeric_type number = underlying_numeric_type()) :
      number_(number)
   {}
   Binary(const Binary& oth) :
      number_(oth.number_)
   {}
   const Binary& opearator=(const underlying_numeric_type number){
      number_ = number;
      return *this;
   }
   const Binary& opearator=(const Binary& oth){
      number_ = oth.number_;
      return *this;
   }
   // Чтобы получить само число
   underlying_numeric_type get_underlying()const {
      return number_;
   }

   // Сдвиги влево и вправо:
   Binary operator<<(underlying_numeric_type bit_count)const {
      return Binary(number_ << bit_count);
   }
   Binary operator>>(underlying_numeric_type bit_count)const {
      return Binary(number_ >> bit_count);
   }
   // Побитовая инверсия - НЕТ - NOT
   Binary operator~()const{
      return Binary(~number_);
   }
   // Побитовое И
   Binary operator&(const Binary& oth)const {
      return Binary(number_ & oth.number_);
   }
   // Побитовое ИЛИ
   Binary operator|(const Binary& oth)const {
      return Binary(number_ | oth.number_);
   }
   // Побитовое строгое ИЛИ - XOR
   Binary operator^(const Binary& oth)const {
      return Binary(number_ ^ oth.number_);
   }
   
private:
   underlying_numeric_type number_;
};

// Для вывода на какой-нибудь std::cout
template<typename underlying_numeric_type>
std::ostream& operator<<(std::ostream& out, const Binary<underlying_numeric_type>& number) {
   for (int bit = sizeof(underlying_numeric_type) - 1; bit >= 0; --bit)
      out << (number.get_underlying() & (1 << bit));
}

int main(int argc, char* argv[]){
   Binary<char> number(0xFF);
   auto result = ~number;
   std::cout << result << '\n'; // Должно вывести 00000000
   result = ~result;
   std::cout << result << '\n'; // Должно вывести 11111111
   Binary<char> another_number(0xFF);
   result = result ^ another_number;
   std::cout << result << '\n'; // Должно вывести 00000000
   result = result & another_number;
   std::cout << result << '\n'; // Должно вывести 00000000

   // и т.д.

   return 0;
}
→ Ссылка