有时在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 。
我已调整样本以测试各种非零值。
答案 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)
考虑到这个问题和这里的答案非常有趣和有趣,我想分享一些性能测试的结果(在模拟器上执行):
经过的时间以秒为单位,越少越好。
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)