“Тема.” Поразрядные операции и их применение.
Нужна помощь с первой практикой, понимаю как решить только кусками
задание:
в ворд Задание 1 (Поразрядные операции).docx (25.8 КБ)
Ребята сказали, что задание лёгкое, но я тупой
Привет. Буду разбирать на примере первого варианта. Задания и правда очень лёгкие.
Задание 1. Определить переменную целого типа, присвоить ей значение, используя константу в шестнадцатеричной системе счисления. Разработать функцию, которое установит заданные в задании биты исходного значения переменной в значение 1, используя соответствующую маску и поразрядную операцию.
Допустим, нам нужно установить в числе 0x412 5-й и 7-й бит справа в единицу. Тогда нам нужна такая маска, в которой пятый и седьмой биты и будут единицей. Устанавливать эти биты в единицу мы будем с помощью побитового ИЛИ байтов числа и байтов маски.
#include <iostream>
#include <bitset>
int main()
{
int number = 0x412; // 1042 = ..._0100_0001_0010
int mask = 0xA0; // ..._0000_1010_0000
std::cout << "Number: \t" << std::bitset<32>(number) << "\n";
std::cout << "Mask: \t" << std::bitset<32>(mask) << "\n";
number = number | mask;
std::cout << "Result: \t" << std::hex << number << "\n";
std::cout << "Result: \t" << std::bitset<32>(number) << std::endl;
}
Задание 2. Разработать функцию, которая обнуляет заданные в задании биты исходного значения целочисленной переменной, введенной пользователем, используя соответствующую маску и поразрядную операцию.
Допустим, нам нужно обнулить с 9-ого бита четыре слева. Значит, нам нужна маска, состоящая из всех единиц, кроме 4-х битов слева от 9-го. Мы будем использовать побитовое И, так как любое число И 0 даёт 0, поэтому и нужны все единицы. Для удобства будем использовать short int
, т.к. в нём 16 бит.
#include <iostream>
#include <bitset>
int main()
{
short int number = 0xFF12; // 1111_1111_0001_0010
short int mask = 0xC3FF; // 1100_0011_1111_1111
std::cout << "Number: \t" << std::bitset<16>(number) << "\n";
std::cout << "Mask: \t" << std::bitset<16>(mask) << "\n";
number = number & mask;
std::cout << "Result: \t" << std::hex << number << "\n";
std::cout << "Result: \t" << std::bitset<16>(number) << std::endl;
}
Задание 3. Разработать функцию, которая умножает значение целочисленной переменной, введенной пользователем, на множитель, используя соответствующую поразрядную операцию.
Допустим, нам нужно умножить введённое число на 8. Это всего-то значит, что нам нужно сдвинуть исходные байты влево на \log_2(8), так как битовый сдвиг влево означает фактически умножение числа на 2. Можешь сам это проверить.
#include <iostream>
#include <bitset>
int main()
{
int number;
std::cout << "Enter number: ";
std::cin >> number;
std::cout << std::bitset<32>(number) << "\n";
number = number << 3;
std::cout << std::bitset<32>(number) << "\n";
std::cout << "Result: " << number;
}
Результат (сдвинули на 3 бита влево)
Задание 4. Разработать функцию, которая делит значение целочисленной переменной, введенной пользователем, на делитель, используя соответствующую поразрядную операцию.
Задание, аналогичное заданию 3, но нужно использовать сдвиг вправо.
#include <iostream>
#include <bitset>
int main()
{
int number;
std::cout << "Enter number: ";
std::cin >> number;
std::cout << std::bitset<32>(number) << "\n";
number = number >> 3;
std::cout << std::bitset<32>(number) << "\n";
std::cout << "Result: " << number;
}
Задание 5. Разработать функцию, реализующую задание, в которой используются только поразрядные операции. В выражении используется маска – переменная. Маска инициализируется единицей в младшем разряде (маска 1) или единицей в старшем разряде (маска 2). Изменяемое число и n вводится с клавиатуры.
Допустим, нам нужно установить n-ый бит в 1, используя маску 1. Единица в младшем разряде - крайняя справа, а в старшем - крайняя слева.
Тут нам просто нужно сдвинуть наш бит, который стоит в крайней правой позиции, на n влево, а затем использовать побитовое ИЛИ (как в задании 1), чтобы установить единицу в n-ю позицию.
#include <iostream>
#include <bitset>
int main()
{
int mask = 0x01;
int number;
int n;
std::cout << "Enter number: ";
std::cin >> number;
std::cout << "Enter position: ";
std::cin >> n;
std::cout << "Number: \t" << std::bitset<32>(number) << "\n";
mask = mask << n;
std::cout << "Mask: \t" << std::bitset<32>(mask) << "\n";
number = number | mask;
std::cout << "Number (res):\t"<< std::bitset<32>(number) << "\n";
std::cout << "Result: " << number;
}
спасибо большое