Инвертировать значения двух старших битов каждой тетрады, если младший бит тетрады единичный - Lisp
Формулировка задачи:
Не могли бы помочь написать программу (common lisp)
Прочитать беззнаковое целое число из стандартного потока ввода и в каждом байте числа инвертировать значения двух старших битов каждой тетрады, если младший бит тетрады единичный. Результат вывести в стандартный поток вывода.
Примеры преобразования:
65535 (11111111 11111111) ==> 13107 (00110011 00110011)
333444 (00000101 00010110 10000100) ==> 644740 (00001001 11010110 10000100)
Решение задачи: «Инвертировать значения двух старших битов каждой тетрады, если младший бит тетрады единичный»
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))))
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д