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

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

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

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

textual
(defun change-byte (b)
 (let ((h (logand b #16RF0))
       (l (logand b #16R0F)))
     (unless (zerop (logand h #16R10)) (setf h (logxor h #16RC0)))  
     (unless (zerop (logand l #16R1))  (setf l (logxor h #16R0C)))  
    (logior h l)))
 
(defun task (z)
   (dotimes (i (ceiling (integer-length z) 8) z) 
     (setf z 
          (dpb (change-byte (ldb (byte 8 (* i 8)) z))
               (byte 8 (* i 8)) z))))

7   голосов, оценка 3.714 из 5


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