Иногда при кодировании в 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, рассмотрите нулевые значения как ложные и ненулевые как истинные.
Я адаптировал образец для тестирования с множеством ненулевых значений.