Реализовать для каждого класса деструктор и три конструктора: без аргументов, копирования и инициализации. (фулл задание ниже)
Помогите, пожалуйста, с решением данной задачи. Уже пару дней над ней ломаю голову, никак не могу ее решить. Реализовать класс 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;
}