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

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

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

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

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

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


СОХРАНИТЬ ССЫЛКУ