Q.Что делает функция золы?Почему передаются параметры small , добавленные к big и -1?Как это работает?Для какой цели он служит для двоичного поиска?
Он выполняет операцию сдвигающих битов , точнее Арифметического сдвига , как объяснено / представлено графически для конкретногослучай Lisp:
> (ash 51 1)
102
Когда вы делаете (ash 51 1)
, он сместит двоичный код 51, т. е. 110011
, на 1 бит в сторону левой стороны и приведет к 1100110
, чтодает вам 102 в десятичном виде.(процесс преобразования двоичного числа в десятичное объясняется в этот ответ )
Вот оно добавляет 0
в наиболее свободном месте (называемом L восток S воспламеняющийся B это).
> (ash 51 -1)
25
Когда вы делаете (ash 51 -1)
, это сдвигает двоичный код 51, то есть 110011
на 1 бит, в сторону правая сторона (отрицательное значение обозначает противоположное направление) и приводит к11001
, что дает вам десятичное число 102.
Вот оно отбрасывает избыточный LSB.
В конкретном примере игры «guss-my-number», проиллюстрированной в Land of Lisp, мы заинтересованы в уменьшении диапазона в два раза или до среднего.Так, (ash (+ *small* *big*) -1))
сделает вдвое 100 + 1 = 100/2, чтобы получить 50. Мы можем проверить это следующим образом:
> (defparameter *small* 1)
*SMALL*
> (defparameter *big* 100)
*BIG*
>
(defun guess-my-number ()
(ash (+ *small* *big*) -1))
GUESS-MY-NUMBER
> (guess-my-number)
50
Интересно отметить, что вы можете удвоить значение целого числасдвигом влево на 1 бит и (приблизительно) его вдвое, сдвигом вправо на 1 бит.