Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Ksiu
0 / 0 / 0
Регистрация: 25.03.2017
Сообщений: 3
1

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

25.03.2017, 01:09. Просмотров 981. Ответов 9

Надо: Прочитать беззнаковое целое число из стандартного потока ввода и в каждом байте числа обнулить нулевой и седьмой биты и сделать единичными третий и четвертый биты. Результат вывести в стандартный поток вывода.
Уже сделано: "обнулить нулевой и седьмой биты":
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(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
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2017, 01:09
Ответы с готовыми решениями:

В каждом байте числа переместить единичные биты в конец
Помогите, пожалуйста, с решением. Ну очень надо! В КАЖДОМ БАЙТЕ числа переместить единичные биты в...

В каждом байте числа переместить единичные биты в конец
Помогите пожалуйста с решением задач. Очень надо. На Си никогда не писал, сам сделать не смогу. 1....

Переставить биты в обратном порядке в каждом байте слова
Требуется переставить биты в обратном порядке в каждом байте слова.

В каждом байте перенести все единичные биты в середину
Помогите написать программу(С++)В каждом байте перенести все единичные биты в середину.

Побитовая обработка: в каждом байте переместить все единичные биты в конец
В каждом байте переместить все единичные биты в конец (Без использования строк и массивов). Есть...

9
_JohnSmith
117 / 53 / 2
Регистрация: 12.02.2017
Сообщений: 194
25.03.2017, 03:55 2
Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun foo (n)
  (let ((n n)
    (and-mask #b01111110)
    (ior-mask #b00011000)
    (shift 0))
    (dotimes (i (ceiling (integer-length n) 8))
      (let ((needle (ldb (byte (+ 8 shift) shift) n)))
    (setf needle (logior (logand needle and-mask) ior-mask))
    (setf n (dpb needle (byte 8 shift)  n))
    (setf shift (+ 8 shift)))))
  n)
2
helter
Эксперт по математике/физике
3838 / 2864 / 310
Регистрация: 12.03.2013
Сообщений: 5,198
25.03.2017, 04:04 3
Цитата Сообщение от _JohnSmith Посмотреть сообщение
(let ((n n)
А зачем?
2
Ksiu
0 / 0 / 0
Регистрация: 25.03.2017
Сообщений: 3
25.03.2017, 09:09  [ТС] 4
может быть, это опечатка и нужно просто (let (n
0
25.03.2017, 09:09
helter
Эксперт по математике/физике
3838 / 2864 / 310
Регистрация: 12.03.2013
Сообщений: 5,198
25.03.2017, 14:12 5
Цитата Сообщение от Ksiu Посмотреть сообщение
нужно просто (let (n
А зачем?
0
nullxdth
1848 / 814 / 64
Регистрация: 12.03.2013
Сообщений: 3,660
25.03.2017, 15:20 6
Лучший ответ Сообщение было отмечено Ksiu как решение

Решение

_JohnSmith, небольшой рефакторинг, с вашего позволения.
Lisp
1
2
3
4
(defun foo (n)
  (dotimes (i (ceiling (integer-length n) 8) n)
    (setf #1=(ldb (byte 8 (* 8 i)) n)
          (logior (logand #1# #b01111110) #b00011000))))
3
Catstail
Модератор
24542 / 12458 / 2275
Регистрация: 12.02.2012
Сообщений: 20,229
25.03.2017, 17:24 7
Цитата Сообщение от Ksiu Посмотреть сообщение
Уже сделано: "обнулить нулевой и седьмой биты":
Цитата Сообщение от Ksiu Посмотреть сообщение
а как сделать единичными третий и четвертый биты не могу сообразить
- это звучит примерно так: "2+3 я сложил, получилось 5. А вот сложить 1 и 4 не получается. Помогите"

Добавлено через 48 минут
Вот как это будет выглядеть в HomeLisp:

Lisp
1
2
3
4
5
6
7
8
9
(defun task (n)
  (let ((a-mask &H7E)
        (o-mask &H0C)
        (d nil)(h 0)(b 0))
   (loop
      (setq h (mod n 256) n (\ n 256))
      (setq b (fix2bit h) b (logand b a-mask) b (logor b o-mask))
      (setq d (cons (bit2fix b) d))
      (when (zerop n) (return (reduce (lambda (acc x) (+ (* 256 acc) x)) d))))))
1
_JohnSmith
117 / 53 / 2
Регистрация: 12.02.2017
Сообщений: 194
25.03.2017, 17:38 8
Цитата Сообщение от helter Посмотреть сообщение
А зачем?
Незнание стандарта и панический страх деструктивных возможностей. Если не знаешь, лучше перестраховаться.
0
Ksiu
0 / 0 / 0
Регистрация: 25.03.2017
Сообщений: 3
25.03.2017, 21:45  [ТС] 9
Цитата Сообщение от nullxdth Посмотреть сообщение
#1=
Я совсем недавно начала изучать лисп, поясните, пожалуйста, вот эту часть кода. это ведь не префиксная нотация и это не присваивание значения переменной. можно в двух словах и про решетку. а если не трудно, то киньте ссылку, где почитать именно про такие конструкции. а ваш код работает. я поставила "лучший ответ"!
0
nullxdth
1848 / 814 / 64
Регистрация: 12.03.2013
Сообщений: 3,660
25.03.2017, 22:13 10
Цитата Сообщение от Ksiu Посмотреть сообщение
Я совсем недавно начала изучать лисп, поясните, пожалуйста, вот эту часть кода. это ведь не префиксная нотация и это не присваивание значения переменной. можно в двух словах и про решетку. а если не трудно, то киньте ссылку, где почитать именно про такие конструкции. а ваш код работает. я поставила "лучший ответ"!
Это стандартный reader macros - установка метки, на которую можно далее сослаться. Часто используется что бы убрать банальный copy-paste.
Lisp
1
2
3
4
5
6
7
(list #1=(list 1 2 3)
      #2=(list 4 5 6)
      #1#
      #1#
      #2#)
 
;; ((1 2 3) (4 5 6) (1 2 3) (1 2 3) (4 5 6))
Подробнее тут: http://clhs.lisp.se/Body/02_dhp.htm
2
25.03.2017, 22:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2017, 22:13

Сдвинуть биты в каждом байте циклически на число, содержащееся в двух старших битах байта
Сдвинуть биты в каждом байте циклически на число, содержащееся в двух старших битах байта.

Инвертировать все биты в старшем байте числа.
Инвертировать все биты в старшем байте числа.

Преобразование числа в биты, а затем биты в числа (hex)
Преобразование числа в биты, а затем биты в числа (hex). Заранее спасибо!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru