СИАОД первая практика Филатов(больницаы)

“Тема.” Поразрядные операции и их применение.
Нужна помощь с первой практикой, понимаю как решить только кусками
задание:
в ворд Задание 1 (Поразрядные операции).docx (25.8 КБ)
Ребята сказали, что задание лёгкое, но я тупой

1 Like

Привет. Буду разбирать на примере первого варианта. Задания и правда очень лёгкие.

Задание 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;
}

image


Задание 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;
}

image


Задание 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 бита влево)
image


Задание 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;
}

image


Задание 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;
}

image

5 Likes

спасибо большое

2 Likes