Подтвердить что ты не робот

Как имитировать логический XOR в ZX Spectrum basic?

Иногда при кодировании в ZX Spectrum Basic мне нужно оценить логические выражения, которые формируются двумя операндами и логическим xor следующим образом:

IF (left operand) xor (right operand) THEN

Так как ZX Basic знает только NOT, OR и AND, мне нужно прибегнуть к какому-то фантастическому расчёту, который включает в себя несколько применений левых/правых операндов. Это неудобно, так как он потребляет время и память, как разреженные, если вы работаете на 8-битной машине. Интересно, есть ли аккуратный трюк для имитации оператора xor.

Чтобы проверить результат, я предоставляю небольшой пример кода:

 5 DEF FN x(a,b)=(a ??? b) : REM the xor formula, change here
10 FOR a=-1 TO 1 : REM left operand
20 FOR b=-1 TO 1 : REM right operand
30 LET r=FN x(a,b) : REM compute xor
40 PRINT "a:";a;" b:";b;" => ";r
50 NEXT b
60 NEXT a

Можете ли вы помочь мне найти решение для исполнителей? Пока я пробовал DEF FN x(a,b)=(a AND NOT b) OR (b AND NOT a), но он несколько неуклюжий.

Edit:

Если вы хотите проверить свою идею, я предлагаю BasinC v1.69 эмулятор ZX (только для Windows).

Как отметил @Jeff большинство основ, таких как ZX one, рассмотрите нулевые значения как ложные и ненулевые как истинные.

Я адаптировал образец для тестирования с множеством ненулевых значений.

4b9b3361

Ответ 1

DEF FN x(a,b)=((NOT a) <> (NOT b))

Использование NOT в качестве принуждения к логическому значению.

РЕДАКТИРОВАТЬ Раньше каждая сторона имела NOT NOT, которая не нужна для установления разницы между ними, поскольку все равно будут принуждаться!

EDIT 2 Добавлены парсеры для сортировки проблемы с приоритетом.

Ответ 2

Логический xor семантически эквивалентен не равному.

IF (left operand) <> (right operand) THEN

должен работать.

Изменить: В случае целых операндов вы можете использовать

IF ((left operand) <> 0) <> ((right operand) <> 0) THEN

Ответ 3

Учитывая очень интересный и интересный этот вопрос и ответы здесь, я хотел бы поделиться результатами некоторых тестов производительности (выполненных на эмуляторе): введите описание изображения здесь

прошедшее время находится в секундах, меньше - лучше. x1 test заключается только в том, чтобы убедиться, что выражение удовлетворяет требованиям и включает распечатку результатов; x256 повторить один и тот же тест 256 раз без печати какого-либо вывода; теги without FN те же, но без факторизации выражения в заявлении FN.

Я также разделяю код и набор тестов на github: https://github.com/rondinif/XOR-in-ZX-Spectrum-basic в интересах всех фанатиков ретро-вычислений (.. like me ) и поделиться нашими мнениями

Ответ 4

Имейте в виду, что значение integer: Я думаю, что математическая операция может быть интересной: (A-B) * (A-B) должен работать Это должно быть меньше времени на основе простой работы.

Или с ABS: ABS (A-B)