有时,在ZX Spectrum Basic中进行编码时,我需要评估由两个操作数和一个逻辑异或运算所形成的逻辑表达式,如下所示:

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),但是有点笨拙。

编辑:

如果要验证您的想法,建议使用BasinC v1.69 ZX模拟器(仅Windows)。

正如@Jeff指出的那样,大多数基础知识(例如ZX的)都将零值视为false,将非零值视为true。

我修改了样本,以测试各种非零值。

最佳答案

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


使用NOT强制转换为布尔值。

编辑以前每边都有NOT NOT,这对于建立两者之间的差异是不必要的,因为仍然会强制!

编辑2添加了括号以解决优先级问题。

关于logical-operators - 如何在ZX Spectrum Basic中模拟逻辑XOR?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46097574/

10-11 15:27