Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <cmath>
- using namespace std;
- void convertTo10Type(void *n, int type, int sys) // Функция перевода любой системы в десятичную
- {
- if (sys == 10) return; // если система и так десятиричная, то завершаме функцию
- if (type == sizeof(char)) return; // если работаем с символом, то и так работаем в десятеричной
- if (type == sizeof(double)) return; // числа с плавающей точкой только в десятичной системе
- int *numb = (int*)n; // явно меняем тип void для указателя n на int и присваеваем его другой переменной
- int count = 0, result = 0;
- do // цикл, в котором число переводится из начальной системы счисления в десятичную
- {
- int mod = int(*numb % 10); // mod присваевается остаток от деления числа на 10
- result = result + pow((double)sys, count++) * mod; // result присваивается значение предыдущей итерации цикла + текущий остаток умноженный на систему счилсения числа в степени порядка цифры, которая перешла в остаток
- *numb /= 10; // число уменьшается в 10 раз
- } while (*numb); // цикл продолжается, пока число не станет равно нулю
- *numb = result; // тк мы работали с переменной ссылочного типа, то мы передаем значение result по адресу numb, что вернет это значение нашему числу
- }
- void biteShow(void* n, unsigned type) // Функция побитового вывода числа
- {
- cout << "Bite show:\n";
- switch(type) // у нас возможны некоторые типы введенной переменной, мы выбираем нужный кейс (int, char, double)
- {
- case sizeof(char):
- {
- char *numb = (char*)n; // явно меняем тип void для указателя n на char и присваеваем его другой переменной
- for (int i = type * 8 - 1; i >= 0; i--) // побитово выводим число. количество итераций цикла равно количеству битов числа
- {
- if (i % 4 == 3) // разбиваем выводимое двоичное число на блоки по 4 бита
- {
- cout << " ";
- }
- cout << ((*numb >> i) & 1u); // выводим на экран i-ый бит числа, находящегося по адресу numb
- }
- break;
- }
- case sizeof(int):
- {
- // аналогично для боследующих кейсов (меняется только тип переменной, с которой работаем, а также количество выводимых битов)
- int *numb = (int*)n;
- for (int i = type * 8 - 1; i >= 0; i--)
- {
- if (i % 4 == 3)
- {
- cout << " ";
- }
- cout << ((*numb >> i) & 1u);
- }
- break;
- }
- default:
- {
- long long int *numb = (long long int*)n;
- for (int i = type * 8 - 1; i >= 0; i--)
- {
- if (i % 4 == 3)
- {
- cout << " ";
- }
- cout << ((*numb >> i) & 1u);
- }
- }
- }
- }
- void biteChang(void* n, unsigned type, unsigned tale, unsigned size, unsigned ch) // Функция изменения определенных битов числа
- {
- switch (type) // у нас возможны некоторые типы введенной переменной, мы выбираем нужный кейс (int, char, double)
- {
- case sizeof(char) :
- {
- char *numb = (char*)n; // явно меняем тип void для указателя n на char и присваеваем его другой переменной
- for (int i = 0; i < size; i++) // цикл, который меняет указанное количество бит (size) с определенной позиции (tale) на установленное значение (ch)
- {
- if (ch) // если устанавливаемое значение = 1, то:
- *numb |= (1u << tale); // делаем побитовое присваивающее ИЛИ нашего числа и числа, в котором единица стоит только на позиции текущего значений tale
- else // иначе:
- *numb &= (0u << tale); // делаем побитовое присваивающее И нашего числа и числа, в котором единица стоит только на позиции текущего значений tale
- tale++; // увеличиваем значений tale на единицу (работаем со следующим разрядом битов)
- }
- break;
- }
- case sizeof(int):
- {// аналогично для боследующих кейсов (меняется только тип переменной, с которой работаем, а также количество выводимых битов)
- int *numb = (int*)n;
- for (int i = 0; i < size; i++)
- {
- if (ch)
- *numb |= (1u << tale);
- else
- *numb &= (0u << tale);
- tale++;
- }
- break;
- }
- default:
- long long int *numb = (long long int*)n;
- for (int i = 0; i < size; i++)
- {
- if (ch)
- *numb |= (1u << tale);
- else
- *numb &= (0u << tale);
- tale++;
- }
- }
- }
- int main()
- {
- int i;
- double d;
- float f;
- char c;
- int sys, type;
- unsigned tale, size, ch;
- cout << fixed; // устанавливаем флаг вывод данных на fixed (числа с плавающей запятой буду выводиться в виде десятичной дроби (без мантисы)
- cout << "Enter your system: ";
- cin >> sys;
- cout << "Enter your type (1-int; 2-char; 3-float; 4-double): ";
- cin >> type;
- switch (type) // у нас возможна работа с 4 типами данных: выбираем нужный кейс
- {
- case 1: { // если работаем с интом, то:
- cout << "Enter int number: "; cin >> i; // вводим число,
- convertTo10Type(&i, sizeof(i), sys); // переводим в десятичную систему счисления,
- cout << "Number in 10-system (befor changing): " << i;
- biteShow(&i, sizeof(i)); // показываем его в двоичном виде,
- cout << endl;
- cout << "Write tale of changing block: "; // вводятся параметры меняемых битов,
- cin >> tale;
- cout << "Write size of changing block: ";
- cin >> size;
- cout << "Write changing value: ";
- cin >> ch; //
- biteChang(&i, sizeof(i), tale, size, ch); // меняются указанные биты,
- cout << "Number after chang: " << i; // демоснтрация измененного числа в десятичном виде,
- biteShow(&i, sizeof(i)); // демонстрация измененного числа в двоичном виде.
- break;
- }
- case 2: { // проводим аналогичные операции, но над char (без перевода в десятичную систему счисления)
- cout << "Enter char symbol: "; cin >> c;
- cout << "Code of this symbole (befor changing): " << c;
- biteShow(&c, sizeof(c));
- cout << endl;
- cout << "Write tale of changing block: ";
- cin >> tale;
- cout << "Write size of changing block: ";
- cin >> size;
- cout << "Write changing value: ";
- cin >> ch;
- biteChang(&c, sizeof(c), tale, size, ch);
- cout << "Number after chang: " << c;
- biteShow(&c, sizeof(c));
- break;
- }
- case 3: { // проводим аналогичные операции, но над float (без перевода в десятичную систему счисления)
- cout << "Enter float number: "; cin >> f;
- cout << "Number (befor changing): " << f;
- biteShow(&f, sizeof(f));
- cout << endl;
- cout << "Write tale of changing block: ";
- cin >> tale;
- cout << "Write size of changing block: ";
- cin >> size;
- cout << "Write changing value: ";
- cin >> ch;
- biteChang(&f, sizeof(f), tale, size, ch);
- cout << "Number after chang: " << f;
- biteShow(&f, sizeof(f));
- break;
- }
- case 4: { // проводим аналогичные операции, но над double (без перевода в десятичную систему счисления)
- cout << "Enter double number: "; cin >> d;
- cout << "Number (befor changing): " << d;
- biteShow(&d, sizeof(d));
- cout << endl;
- cout << "Write tale of changing block: ";
- cin >> tale;
- cout << "Write size of changing block: ";
- cin >> size;
- cout << "Write changing value: ";
- cin >> ch;
- biteChang(&d, sizeof(d), tale, size, ch);
- cout << "Number after chang: " << d;
- biteShow(&d, sizeof(d));
- break;
- }
- default: // если выбран неверный тип (значение, отличное от { 1, 2, 3, 4 })
- cout << "error. enter number of your data type:";
- }
- cout << endl;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement