Инвертировать значения двух старших битов каждой тетрады, если младший бит тетрады единичный - 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))))
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д