Загрузка...

Кто может решить задачку на Си?

Тема в разделе C/C++ создана пользователем zerro5 27 фев 2022. 344 просмотра

  1. zerro5
    zerro5 Автор темы 27 фев 2022 4 14 июн 2019
    Преобразовать число, поменяв местами цифры каждой пары соседних цифр в двоичной записи данного натурального числа. Обмен начинается с младших разрядов. Непарная старшая цифра остается без изменения.(Нужно использовать побитовые операции)
     
  2. M1h4n1k
    M1h4n1k 28 фев 2022 Ответы skysmart - t.me/SkyAnsBot 272 4 май 2021
    а пример можно? Я не уверен, но вроде тут же достаточно просто поменять числа местами ( swap(a, b) )?
     
    28 фев 2022 Изменено
    1. Replacer
      M1h4n1k, да, только надо додуматься до использования xor.
    2. M1h4n1k
      Replacer, ну типа свап через ксор?
      тогда так:
      C
      int a = 69;
      int b = 42;

      a ^= b;
      b ^= a;
      a ^= b;
    3. Replacer
      M1h4n1k, что-то подобное, да
  3. zerro5
    zerro5 Автор темы 1 мар 2022 4 14 июн 2019
    M1h4n1k, примера нет)
    --- Сообщение объединено с предыдущим 1 мар 2022
    M1h4n1k, я предполагаю, что нужно ввести натурально число, потом поменять цифры в двоичном коде и вывести это. Например, число 10 = 1010, меняю местами 0101. Вот так я это понимаю, но в виде кода не могу записать. Может быть я не прав.
     
    1. M1h4n1k
      zerro5, а как это тогда решать, если нет примера?)
      А ебать, я понял задачу только что, ахуеть (бред какой то, в первый раз увидел)
      Ща подумаю
    2. M1h4n1k
      zerro5, Я посидел, подумал, пришел к выводу, что надо сделать что то такое:
      C
      int a = 0b101011;
      int sw = a XNOR ((a << 1) ^ (a >> 1));
      cout << bitwise<6>(sw);
      НО здесь 2 проблемы:
      1 - В плюсах я не нашел встроенного оператора побитового XNOR'а (побитовое сравнение/побитовый xor, только обратный, например
      1100
      XNOR 1010
      1001
      )
      2 - (a << 1) не обрезает число, т.е. 0b1010 << 1 = 0b10100, а хотелось бы 0b0100, но это вроде не особо проблема, если придумать xnor
    3. vtlstolyarov
      M1h4n1k, если я правильно понял условие задачи то 11 должно превратиться в 7 (1011 -> 0111), 26 -> 21 (11010 -> 10101)
  4. zerro5
    zerro5 Автор темы 2 мар 2022 4 14 июн 2019
    vtlstolyarov, именно так
    --- Сообщение объединено с предыдущим 2 мар 2022
    M1h4n1k, вот такие задачки в вузе. Показали презентацию про побитовые операции и все.
     
    2 мар 2022 Изменено
    1. M1h4n1k
      zerro5, а есть презентация сама? Может посмотрю, подумаю
    2. vtlstolyarov
      zerro5, Как-то так?
      C
      #include <stdio.h>

      int main() {
      int number;
      printf("Введите число: ");
      scanf("%d", &number);
      for (int mask = 3, rest = number; mask != 0 && (rest & ~1) != 0; mask <<= 2, rest >>= 2)
      {
      number = (~mask & number) | (mask & ((mask & number) << 1) | ((mask & number) >> 1));
      }

      printf("Ответ: %d", number);
      return 0;
      }
  5. zerro5
    zerro5 Автор темы 2 мар 2022 4 14 июн 2019
    vtlstolyarov, спасибо. Похоже это и есть решение.
     
Top
Загрузка...