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