В каждом байте числа обнулить 0-ой и 7-ой биты и сделать единичными 3-ий и 4-ый биты - Lisp

Узнай цену своей работы

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

Надо: Прочитать беззнаковое целое число из стандартного потока ввода и в каждом байте числа обнулить нулевой и седьмой биты и сделать единичными третий и четвертый биты. Результат вывести в стандартный поток вывода. Уже сделано: "обнулить нулевой и седьмой биты":
(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)))
а как сделать единичными третий и четвертый биты не могу сообразить. help, задача срочная! пожалуйста, отзовитесь, кто понимает лисп!

Решение задачи: «В каждом байте числа обнулить 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:

  1. (dotimes (i (ceiling (integer-length n) 8) n) — цикл по всем байтам числа n
  2. (setf #1=(ldb (byte 8 (* 8 i)) n) — получение i-го байта из числа n
  3. (logior (logand #1# #b01111110) #b00011000) — обнуление 0-го и 7-го битов и установка 3-го и 4-го битов в 1
  4. Конец цикла В данном коде нет использования переменных с номерами 2, 3, 5, 6, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5
Похожие ответы