15

有时在 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 one's)确实将零值视为false,将非零值视为true

我已经调整了样本以使用各种非零值进行测试。

4

4 回答 4

11

逻辑异或在语义上等价于不等于。

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

应该管用。

编辑:对于整数操作数,您可以使用

IF ((left operand) <> 0) <> ((right operand) <> 0) THEN
于 2017-09-07T13:30:07.153 回答
5

考虑到这个问题和这里的答案非常有趣和有趣,我想分享一些性能测试的结果(在模拟器上执行): 在此处输入图像描述

经过的时间以秒为单位,越少越好。x1 test只看表达式是否满足要求,包括打印结果,重复x256相同的测试256次,不打印任何输出;测试是相同的without FN,但没有考虑 FN 语句中的表达式。

我还在github 上分享代码和测试套件:https://github.com/rondinif/XOR-in-ZX-Spectrum-basic为了所有复古计算狂热者(..like me)的利益并分享我们的意见

于 2017-09-24T10:28:58.293 回答
5
DEF FN x(a,b)=((NOT a) <> (NOT b))

用作NOT对布尔值的强制。

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

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

于 2017-09-22T18:37:28.850 回答
2

请记住,值是整数:我认为数学运算可能会很有趣:(AB)*(AB) 应该可以工作基于简单的运算,它应该更少耗时。

或带 ABS : ABS (AB)

于 2017-09-22T01:28:44.150 回答