如何在ZX Spectrum basic中模仿逻辑XOR?

时间:2017-09-07 13:24:02

标签: xor basic retro-computing zxspectrum

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

<button onclick="addRow()" class="btn btn-primary">Button Text</button>

由于ZX Basic只知道NOT,OR和AND我不得不求助于某种奇特的计算,包括左/右操作数的多次使用。这很尴尬,因为它消耗时间和内存,如果你在8位机器上工作,这两者都很稀疏。我想知道是否有一个模仿xor运算符的巧妙技巧。

为了测试结果,我提供了一个小代码示例:

IF (left operand) xor (right operand) THEN

你能帮我找一个高性能的解决方案吗?到目前为止,我尝试 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 ,但它有些笨拙。

修改

如果您想测试自己的想法,我建议使用BasinC v1.69 ZX模拟器(仅限Windows)。

正如@Jeff所指出的那样,大多数基础知识,比如ZX one,确实将零值视为 false ,将非零值视为 true

我已调整样本以测试各种非零值。

4 个答案:

答案 0 :(得分:10)

逻辑xor在语义上等同于不相等。

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

应该有用。

编辑:在整数操作数的情况下,您可以使用

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

答案 1 :(得分:4)

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

使用NOT作为布尔值的强制。

编辑以前每一方都有NOT NOT,这对于确定两者之间的差异是不必要的,因为一个人仍然会强迫!

编辑2 添加了parens以解决优先问题。

答案 2 :(得分:4)

考虑到这个问题和这里的答案非常有趣和有趣,我想分享一些性能测试的结果(在模拟器上执行): enter image description here

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

为了所有复古计算狂热分子(也像我一样)的利益,我也分享the code and test suite on github: https://github.com/rondinif/XOR-in-ZX-Spectrum-basic并分享我们的意见

答案 3 :(得分:2)

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

或ABS:ABS(A-B)