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

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

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

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

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

textual
Листинг программы
(defun task (n)
  (let ((bn (fix2bit n))
        (m1 &H01)
        (m2 &H0C))
   (iter (repeat 8)
     (unless (eq &H0 (logAnd m1 bn)) (setq bn (logXor bn m2)))
     (setq m1 (leftShift m1 4) m2 (leftShift m2 4))) (bit2fix bn)))
         
==> TASK
 
(task 65535)
 
==> 13107
 
(task 333444)
 
==> 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
Похожие ответы