Advertisement
Guest User

Untitled

a guest
Dec 15th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.92 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. void convertTo10Type(void *n, int type, int sys) // Функция перевода любой системы в десятичную
  9. {
  10. if (sys == 10) return; // если система и так десятиричная, то завершаме функцию
  11. if (type == sizeof(char)) return; // если работаем с символом, то и так работаем в десятеричной
  12. if (type == sizeof(double)) return; // числа с плавающей точкой только в десятичной системе
  13.  
  14. int *numb = (int*)n; // явно меняем тип void для указателя n на int и присваеваем его другой переменной
  15. int count = 0, result = 0;
  16. do // цикл, в котором число переводится из начальной системы счисления в десятичную
  17. {
  18. int mod = int(*numb % 10); // mod присваевается остаток от деления числа на 10
  19. result = result + pow((double)sys, count++) * mod; // result присваивается значение предыдущей итерации цикла + текущий остаток умноженный на систему счилсения числа в степени порядка цифры, которая перешла в остаток
  20. *numb /= 10; // число уменьшается в 10 раз
  21. } while (*numb); // цикл продолжается, пока число не станет равно нулю
  22.  
  23. *numb = result; // тк мы работали с переменной ссылочного типа, то мы передаем значение result по адресу numb, что вернет это значение нашему числу
  24. }
  25.  
  26. void biteShow(void* n, unsigned type) // Функция побитового вывода числа
  27. {
  28. cout << "Bite show:\n";
  29. switch(type) // у нас возможны некоторые типы введенной переменной, мы выбираем нужный кейс (int, char, double)
  30. {
  31. case sizeof(char):
  32. {
  33. char *numb = (char*)n; // явно меняем тип void для указателя n на char и присваеваем его другой переменной
  34. for (int i = type * 8 - 1; i >= 0; i--) // побитово выводим число. количество итераций цикла равно количеству битов числа
  35. {
  36. if (i % 4 == 3) // разбиваем выводимое двоичное число на блоки по 4 бита
  37. {
  38. cout << " ";
  39. }
  40. cout << ((*numb >> i) & 1u); // выводим на экран i-ый бит числа, находящегося по адресу numb
  41. }
  42. break;
  43. }
  44. case sizeof(int):
  45. {
  46. // аналогично для боследующих кейсов (меняется только тип переменной, с которой работаем, а также количество выводимых битов)
  47. int *numb = (int*)n;
  48. for (int i = type * 8 - 1; i >= 0; i--)
  49. {
  50. if (i % 4 == 3)
  51. {
  52. cout << " ";
  53. }
  54. cout << ((*numb >> i) & 1u);
  55. }
  56. break;
  57. }
  58. default:
  59. {
  60. long long int *numb = (long long int*)n;
  61. for (int i = type * 8 - 1; i >= 0; i--)
  62. {
  63. if (i % 4 == 3)
  64. {
  65. cout << " ";
  66. }
  67. cout << ((*numb >> i) & 1u);
  68. }
  69. }
  70.  
  71. }
  72. }
  73.  
  74. void biteChang(void* n, unsigned type, unsigned tale, unsigned size, unsigned ch) // Функция изменения определенных битов числа
  75. {
  76. switch (type) // у нас возможны некоторые типы введенной переменной, мы выбираем нужный кейс (int, char, double)
  77. {
  78. case sizeof(char) :
  79. {
  80. char *numb = (char*)n; // явно меняем тип void для указателя n на char и присваеваем его другой переменной
  81. for (int i = 0; i < size; i++) // цикл, который меняет указанное количество бит (size) с определенной позиции (tale) на установленное значение (ch)
  82. {
  83. if (ch) // если устанавливаемое значение = 1, то:
  84. *numb |= (1u << tale); // делаем побитовое присваивающее ИЛИ нашего числа и числа, в котором единица стоит только на позиции текущего значений tale
  85. else // иначе:
  86. *numb &= (0u << tale); // делаем побитовое присваивающее И нашего числа и числа, в котором единица стоит только на позиции текущего значений tale
  87. tale++; // увеличиваем значений tale на единицу (работаем со следующим разрядом битов)
  88. }
  89. break;
  90. }
  91. case sizeof(int):
  92. {// аналогично для боследующих кейсов (меняется только тип переменной, с которой работаем, а также количество выводимых битов)
  93. int *numb = (int*)n;
  94. for (int i = 0; i < size; i++)
  95. {
  96. if (ch)
  97. *numb |= (1u << tale);
  98. else
  99. *numb &= (0u << tale);
  100. tale++;
  101. }
  102. break;
  103. }
  104. default:
  105. long long int *numb = (long long int*)n;
  106. for (int i = 0; i < size; i++)
  107. {
  108. if (ch)
  109. *numb |= (1u << tale);
  110. else
  111. *numb &= (0u << tale);
  112. tale++;
  113. }
  114. }
  115. }
  116.  
  117. int main()
  118. {
  119. int i;
  120. double d;
  121. float f;
  122. char c;
  123. int sys, type;
  124. unsigned tale, size, ch;
  125. cout << fixed; // устанавливаем флаг вывод данных на fixed (числа с плавающей запятой буду выводиться в виде десятичной дроби (без мантисы)
  126.  
  127. cout << "Enter your system: ";
  128. cin >> sys;
  129. cout << "Enter your type (1-int; 2-char; 3-float; 4-double): ";
  130. cin >> type;
  131.  
  132. switch (type) // у нас возможна работа с 4 типами данных: выбираем нужный кейс
  133. {
  134. case 1: { // если работаем с интом, то:
  135. cout << "Enter int number: "; cin >> i; // вводим число,
  136.  
  137. convertTo10Type(&i, sizeof(i), sys); // переводим в десятичную систему счисления,
  138. cout << "Number in 10-system (befor changing): " << i;
  139. biteShow(&i, sizeof(i)); // показываем его в двоичном виде,
  140. cout << endl;
  141.  
  142. cout << "Write tale of changing block: "; // вводятся параметры меняемых битов,
  143. cin >> tale;
  144. cout << "Write size of changing block: ";
  145. cin >> size;
  146. cout << "Write changing value: ";
  147. cin >> ch; //
  148.  
  149. biteChang(&i, sizeof(i), tale, size, ch); // меняются указанные биты,
  150. cout << "Number after chang: " << i; // демоснтрация измененного числа в десятичном виде,
  151. biteShow(&i, sizeof(i)); // демонстрация измененного числа в двоичном виде.
  152. break;
  153. }
  154. case 2: { // проводим аналогичные операции, но над char (без перевода в десятичную систему счисления)
  155. cout << "Enter char symbol: "; cin >> c;
  156.  
  157. cout << "Code of this symbole (befor changing): " << c;
  158. biteShow(&c, sizeof(c));
  159. cout << endl;
  160.  
  161. cout << "Write tale of changing block: ";
  162. cin >> tale;
  163. cout << "Write size of changing block: ";
  164. cin >> size;
  165. cout << "Write changing value: ";
  166. cin >> ch;
  167.  
  168. biteChang(&c, sizeof(c), tale, size, ch);
  169. cout << "Number after chang: " << c;
  170. biteShow(&c, sizeof(c));
  171. break;
  172. }
  173. case 3: { // проводим аналогичные операции, но над float (без перевода в десятичную систему счисления)
  174. cout << "Enter float number: "; cin >> f;
  175.  
  176. cout << "Number (befor changing): " << f;
  177. biteShow(&f, sizeof(f));
  178. cout << endl;
  179.  
  180. cout << "Write tale of changing block: ";
  181. cin >> tale;
  182. cout << "Write size of changing block: ";
  183. cin >> size;
  184. cout << "Write changing value: ";
  185. cin >> ch;
  186.  
  187. biteChang(&f, sizeof(f), tale, size, ch);
  188. cout << "Number after chang: " << f;
  189. biteShow(&f, sizeof(f));
  190. break;
  191. }
  192. case 4: { // проводим аналогичные операции, но над double (без перевода в десятичную систему счисления)
  193. cout << "Enter double number: "; cin >> d;
  194.  
  195. cout << "Number (befor changing): " << d;
  196. biteShow(&d, sizeof(d));
  197. cout << endl;
  198.  
  199. cout << "Write tale of changing block: ";
  200. cin >> tale;
  201. cout << "Write size of changing block: ";
  202. cin >> size;
  203. cout << "Write changing value: ";
  204. cin >> ch;
  205.  
  206. biteChang(&d, sizeof(d), tale, size, ch);
  207. cout << "Number after chang: " << d;
  208. biteShow(&d, sizeof(d));
  209. break;
  210. }
  211. default: // если выбран неверный тип (значение, отличное от { 1, 2, 3, 4 })
  212. cout << "error. enter number of your data type:";
  213. }
  214. cout << endl;
  215. system("pause");
  216. return 0;
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement