В каждом байте числа обнулить 0-ой и 7-ой биты и сделать единичными 3-ий и 4-ый биты - Lisp
Формулировка задачи:
Надо: Прочитать беззнаковое целое число из стандартного потока ввода и в каждом байте числа обнулить нулевой и седьмой биты и сделать единичными третий и четвертый биты. Результат вывести в стандартный поток вывода.
Уже сделано: "обнулить нулевой и седьмой биты":
а как сделать единичными третий и четвертый биты не могу сообразить. help, задача срочная! пожалуйста, отзовитесь, кто понимает лисп!
(defvar x 0) (setf x (read)) (defun change-byte (b) (dotimes (i 4 b) (when (= i 0) (logbitp i b) (setf b (logxor (+ (ash 1 i) (ash 1 (- 7 i))) b))))) (dotimes (i (ceiling (integer-length x) 8)) (setf x (dpb (change-byte (ldb (byte 8 (* i 8)) x)) (byte 8 (* i 8)) x)))
Решение задачи: «В каждом байте числа обнулить 0-ой и 7-ой биты и сделать единичными 3-ий и 4-ый биты»
textual
Листинг программы
(defun foo (n) (dotimes (i (ceiling (integer-length n) 8) n) (setf #1=(ldb (byte 8 (* 8 i)) n) (logior (logand #1# #b01111110) #b00011000))))
Объяснение кода листинга программы
В данном коде функция foo принимает в качестве аргумента n – некоторый целочисленный номер. Внутри функции происходит цикл по всем байтам числа n:
- (dotimes (i (ceiling (integer-length n) 8) n) — цикл по всем байтам числа n
- (setf #1=(ldb (byte 8 (* 8 i)) n) — получение i-го байта из числа n
- (logior (logand #1# #b01111110) #b00011000) — обнуление 0-го и 7-го битов и установка 3-го и 4-го битов в 1
- Конец цикла В данном коде нет использования переменных с номерами 2, 3, 5, 6, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д