Логические операции в данном разделе в качестве аргументов требуют целых чисел. Передача числа любого другого формата является ошибкой. Функции обрабатывают целые числа, как если бы они были представлены в двух системах счисления. FIXME _____________________________________________
Заметка для реализации: Внутренне, конечно, реализация Common Lisp’а может использовать и может и нет представление числа с дополнительным кодом. Все, что необходимо это чтобы логические операции выполняли вычисление так, как описано в разделе.
Логические операции предоставляют удобный способ для представления бесконечного вектора битов. Пусть такой концептуальный вектор будет индексироваться с помощью неотрицательного целого. Тогда биту j присваивается «вес (weight)» 2j. Предположим, что лишь конечное число битов являются 1 или только конечное число битов являются 0. Вектор, у которого конечное число битов 1, представлен как сумма всех весов этих битов, и является положительным числом. Вектор, у которого конечное число битов 0, представлен как -1 минус сумма всех весов этих битов, и является отрицательным числом. FIXME
Данный метод использования целых чисел для представления битовых векторов может в свою очередь использоваться для представления множеств. Предположим, что некоторая (возможно бесконечная) совокупность рассуждений для множеств отображается в неотрицательные целые числа. FIXME Тогда множество может быть представлено как битовый вектор. Элемент принадлежит множеству, если бит, индекс которого соответствует элементу, является 1. Таким образом все конечные множества могут быть представлены с помощью положительных целых, и множества, дополнения которых конечны, с помощью отрицательных чисел. Функции logior, logand и logxor, определённые ниже, вычисляют объединение, пересечение и симметричную разность для таких множеств.
Функция возвращает побитовое логическое или для аргументов. Если не задан ни один аргумент, возвращается ноль.
Функция возвращает побитовое логическое исключающее или для аргументов. Если не задан ни один аргумент, возвращается ноль.
Функция возвращает побитовое логическое и для аргументов. Если ни один аргумент не задан, возвращается ноль.
Функция возвращает побитовую логическую эквивалентность (также известную как исключающее отрицающее или для аргументов. Если не задан ни один аргумент, возвращается ноль.
[Функция]
lognand integer1 integer2Данные функции служат для шести нетривиальные битовый логический операций для двух аргументов. Так как они не ассоциативны, они принимают только два аргумента.
В следующей таблице перечислены десять битовых логических операций для двух целых чисел.
integer1 | 0 | 0 | 1 | 1 | |
integer2 | 0 | 1 | 0 | 1 | Имя операции |
logand | 0 | 0 | 0 | 1 | и |
logior | 0 | 1 | 1 | 1 | или |
logxor | 0 | 1 | 1 | 0 | исключающее или |
logeqv | 1 | 0 | 0 | 1 | эквивалентность (исключающее отрицающее или) |
lognand | 1 | 1 | 1 | 0 | не и |
lognor | 1 | 0 | 0 | 0 | не или |
logandc1 | 0 | 1 | 0 | 0 | не integer1 и integer2 |
logandc2 | 0 | 0 | 1 | 0 | integer1 и не integer2 |
logorc1 | 1 | 1 | 0 | 1 | не integer1 или integer2 |
logorc2 | 1 | 0 | 1 | 1 | integer1 или не integer2 |
[Функция]
boole op integer1 integer2Функция boole принимает операцию op и два целых числа, и возвращает целое число полученное применением операции op к этим двум числам. Точные значения шестнадцати констант зависят от реализации, но они подходят для использования в качестве первого аргумента для boole:
integer1 | 0 | 0 | 1 | 1 | |
integer2 | 0 | 1 | 0 | 1 | Выполняемая операция |
boole-clr | 0 | 0 | 0 | 0 | всегда 0 |
boole-set | 1 | 1 | 1 | 1 | всегда 1 |
boole-1 | 0 | 0 | 1 | 1 | integer1 |
boole-2 | 0 | 1 | 0 | 1 | integer2 |
boole-c1 | 1 | 1 | 0 | 0 | дополнение integer1 |
boole-c2 | 1 | 0 | 1 | 0 | дополнение integer2 |
boole-and | 0 | 0 | 0 | 1 | и |
boole-ior | 0 | 1 | 1 | 1 | или |
boole-xor | 0 | 1 | 1 | 0 | исключающее или |
boole-eqv | 1 | 0 | 0 | 1 | эквивалентность (исключительное отрицающее или) |
boole-nand | 1 | 1 | 1 | 0 | не и |
boole-nor | 1 | 0 | 0 | 0 | не или |
boole-andc1 | 0 | 1 | 0 | 0 | не integer1 и integer2 |
boole-andc2 | 0 | 0 | 1 | 0 | integer1 и не integer2 |
boole-orc1 | 1 | 1 | 0 | 1 | не integer1 или integer2 |
boole-orc2 | 1 | 0 | 1 | 1 | integer1 или не integer2 |
Таким образом boole может вычислять все шестнадцать логических функций для двух аргументов. В целом,
и далее по аналогии. boole полезна, когда необходимо параметризировать процедуру так, что они может использовать одну из нескольких логических операций.
Функция возвращает битовое логическое отрицание аргумента. Каждый бит результата является дополнение соответствующего исходного бита аргумента.
logtest является предикатом, который истинен, если любой бит определённый как 1 в integer1 также является соответствующим битом 1 в integer2.
Предикат logbitp является истиной, если бит в позиции index в целом числе integer (то есть, его вес 2index), является 1, иначе предикат ложен. Например:
index
должен быть неотрицательным целым числом.Если count положительное число, данная функция арифметически сдвигает число integer влево на количество бит count. Если count отрицательное число, функция сдвигает число integer вправо. Знак результата всегда такое же как и исходного числа integer.
Говоря математически, эта операция выполняет вычисления floor(integer ⋅ 2count).
Логически, функция перемещает все биты числа integer влево, добавляя нулевые биты в конец, или вправо отбрасывая биты в конце числа. (В этом контексте вопрос о том, что сдвигается налево, не относится к делу. Целые числа, рассматриваемые как строки битов, являются «полубесконечными», то есть концептуально расширяются бесконечно влево FIXME.) Например:
Функция возвращает количество бит в числе integer. Если integer положительное число, тогда подсчитаны будут биты 1. Если число integer отрицательно, то в два раза дополненной (two’s-complement) бинарной форме будут подсчитаны биты 0. FIXME Результатом всегда является неотрицательное целое число. Например:
Следующее тождество всегда верно:
Данная функция выполняет следующие вычисления