我有一个需要输出唯一格式化字节的输入表。从算法输出的字节只需打开 1 位,即可提供 8 个独特的输出。只要每个输入都有唯一的输出,输入就不必与特定的输出相关联。以下是所有可能的输入和输出的列表。
输入: -00001000 -00001001 -00000001 -00000101 -00000100 -00000110 -00000010 -00001010
输出: -10000000 -01000000 -00100000 -00010000 -00001000 -00000100 -00000010 -00000001
我想知道是否有设计用于执行此操作的逻辑算法。我目前正在为此使用一个不是很优化的查找表。我可以访问 6502 汇编中使用的所有操作。
我已将我的查找表代码作为答案中的一种可能解决方案,但我正在寻找更好的东西(如果存在的话)。
最佳答案
18字节,11个周期
一个小的查找表将是最小、最快的,并且不要忘记最通用的问题解决方案。您可以轻松更改这些数字相互映射的方式。
LDX input ; 2 bytes, 3 cycles (Zero Page)
LDA lookup,X ; 3 bytes, 5 cycles
STA output ; 2 bytes, 3 cycles (Zero Page)
lookup: ; 11 bytes
.byte $00,$20,$02,$00,$08,$10,$04,$00,$80,$40,$01
提示:查找表的第一个字节 ($00) 可能会兼作程序中所需的某个字符串的终止零。这是多年来我不止一次使用过的一个技巧。
18字节,10个周期
通过绝对确保查找表不跨越页面边界来减少 1 个周期(5 个周期然后变成 4 个周期)。
LDX input ; 2 bytes, 3 cycles (Zero Page)
LDA lookup,X ; 3 bytes, 4 cycles
STA output ; 2 bytes, 3 cycles (Zero Page)
lookup: ; 11 bytes
.byte $00,$20,$02,$00,$08,$10,$04,$00,$80,$40,$01
17 个字节,10 个周期
通过将查找表放在零页上(3 个字节然后变成 2 个字节)来减少 1 个字节和 1 个周期。
LDX input ; 2 bytes, 3 cycles (Zero Page)
LDA lookup,X ; 2 bytes, 4 cycles (Zero Page)
STA output ; 2 bytes, 3 cycles (Zero Page)
lookup: ; 11 bytes
.byte $00,$20,$02,$00,$08,$10,$04,$00,$80,$40,$01
关于assembly - 是否有逻辑算法为给定的输入生成唯一的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72841592/