Инвертировать значения двух старших битов каждой тетрады - Lisp

Узнай цену своей работы

Формулировка задачи:

Задание Прочитать беззнаковое целое число из стандартного потока ввода и в каждом байте числа инвертировать значения двух старших битов каждой тетрады, если младший бит тетрады единичный. Результат вывести в стандартный поток вывода. Примеры преобразования: 65535 (11111111 11111111) ==> 13107 (00110011 00110011) 333444 (00000101 00010110 10000100) ==> 644740 (00001001 11010110 10000100)

Решение задачи: «Инвертировать значения двух старших битов каждой тетрады»

textual
Листинг программы
  1. (defun task (n)
  2.   (let ((bn (fix2bit n))
  3.         (m1 &H01)
  4.         (m2 &H0C))
  5.    (iter (repeat 8)
  6.      (unless (eq &H0 (logAnd m1 bn)) (setq bn (logXor bn m2)))
  7.      (setq m1 (leftShift m1 4) m2 (leftShift m2 4))) (bit2fix bn)))
  8.          
  9. ==> TASK
  10.  
  11. (task 65535)
  12.  
  13. ==> 13107
  14.  
  15. (task 333444)
  16.  
  17. ==> 644740

Объяснение кода листинга программы

В коде определена функция task, которая принимает в качестве аргумента целое число n. Внутри функции используются следующие переменные:

  1. bn — переменная, которая изначально содержит значение n с двумя старшими битами, установленными в ноль. В процессе выполнения функции значение переменной bn будет меняться.
  2. m1 и m2 — две переменные, которые используются для хранения результатов промежуточных вычислений. Изначально обе переменные равны нулю. Внутри функции используется цикл iter, который повторяется 8 раз. На каждой итерации выполняются следующие действия:
  3. Проверяется равенство двух старших битов значения переменной bn нулю. Если это так, то выполняется операция побитового исключающего OR над bn и m2, после чего значение переменной bn обновляется.
  4. Значения переменных m1 и m2 сдвигаются влево на 4 бита, а затем выполняется операция побитового исключающего OR над m1 и m2. Результат этой операции присваивается переменной m1. После завершения цикла значение переменной bn преобразуется из двоичного в десятичное с помощью функции bit2fix. В конце кода вызывается функция task с аргументом 65535, что приводит к выводу значения 13107. Затем вызывается функция task с аргументом 333444, что приводит к выводу значения 644740.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.667 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы