【发布时间】:2018-02-16 06:20:35
【问题描述】:
有时在 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。
我已调整样本以使用各种非零值进行测试。
【问题讨论】:
-
逻辑上,NOT(A AND B) AND (A OR B) ?
-
@Worse_Username 可以工作,但它并没有加速我到目前为止的代码。 ^^
-
我喜欢下面的
<>答案,但如果 ZX BASIC 支持函数式 IF-ELSE,另一个纯粹合乎逻辑的可能性是 IF A THEN (NOT B) ELSE (B) - 在 C 中,你可以写a?!b:b -
@JeffZeitlin 我也喜欢
<>的答案,但它并不能解决所有情况。事实上,我有类似50 IF a THEN GOTO 10060 IF NOT b...100 IF b THEN ...之类的语句模仿三元运算符,但所有的 goto 都使这成为维护的噩梦。 -
我还在寻找简洁的解决方案,请随时回答。欢迎任何想法。
标签: logical-operators xor basic retro-computing zxspectrum