Advertisement
kiraventom

Untitled

Dec 13th, 2017
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.76 KB | None | 0 0
  1.  
  2. /* Ввести последовательность из 8 целых чисел. Если код символа нечетный, то заменить в нем старший бит нулем, иначе – заменить два младших бита единицами. Вывести исходную последовательность в десятичной и восьмеричной формах; преобразованную последовательность в десятичной и восьмеричной формах.*/
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <locale.h>
  7. #include <math.h>
  8. #include <limits.h>
  9.  
  10. #define ON 1
  11. #define OFF 0
  12.  
  13. #define DEBUG OFF
  14.  
  15. #if DEBUG == ON
  16.     #define debug(msg) printf ("%i\n", msg);
  17. #else
  18.     #define debug(msg)
  19. #endif
  20.  
  21. void main() {
  22.     setlocale (LC_ALL, "Russian");
  23.  
  24.     size_t len = sizeof(int) * CHAR_BIT; //количество байтов * 8 бит
  25.     unsigned i, j;
  26.     int a[8];
  27.  
  28.     puts ("Введите 8 чисел через пробел:");
  29.     scanf ("%i %i %i %i %i %i %i %i", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8]);
  30.  
  31.     puts ("Исходная последов. в десят. форме: ");
  32.     for (i = 0; i < 8; i++){
  33.         printf ("%i ", a[i]);
  34.     }
  35.     puts ("\n");
  36.     puts ("Исходная последов. в восьмер. форме: ");
  37.     for (i = 0; i < 8; i++){
  38.         printf ("%o ", a[i]);
  39.     }
  40.     puts ("\n");
  41.     // переменная check - единица и ряд нулей
  42.     // используется для побитовой проверки числа слева направо при помощи побитового сдвига
  43.     int check = (1 << (len-2)); //единица на 2 бите слева, т.к. первый бит определяет знак
  44.     debug (check);
  45.  
  46.     for (j = 0; j < 8; j++){
  47.         if ((a[j] & 1) == 1) { //если нечетный
  48.             for (i = 0; i < len; i++){
  49.                 // перебираем двоичный код числа слева направо
  50.                 if ((a[j] & check) != 0) {//если очередной бит не равен 0
  51.                     debug (check);
  52.                     a[j] = a[j] - check; //превращаем его в 0
  53.                     break; // выходим из цикла
  54.                 }
  55.                 else{
  56.                     check = check >> 1; //если очередной бит равен 0, переходим к следующему
  57.                 }
  58.             }
  59.         }
  60.         else {// если четный
  61.             a[j] = a[j] | 3; //последние два бита заменяем на 1
  62.         }
  63.     }
  64.  
  65.     puts ("Преобраз. последов. в десят. форме: ");
  66.     for (i = 0; i < 8; i++){
  67.         printf ("%i ", a[i]);
  68.     }
  69.     puts ("\n");
  70.     puts ("Преобраз. последов. в восьмер. форме: ");
  71.     for (i = 0; i < 8; i++){
  72.         printf ("%o ", a[i]);
  73.     }
  74.     puts ("\n");
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement