Ergebnis: 686
Alle Snippets setzen voraus, dass die Zahlen bereits in Zelle 0 und 1 geladen sind und der Zeiger auf Zelle 0 zeigt. Ich kann später ein Atoi-Snippet hinzufügen, wenn dies für die Herausforderung erforderlich ist. Im Moment können Sie den Code folgendermaßen ausprobieren:
+++++++++> number 1
++++< number 2
XOR 221
Das Ergebnis wird in Zelle 10 geschrieben, der Zeiger endet in Zelle 5
>>>>>++++++++[-<<<<<[->>+<<[->>->+<]>>[->>>>+<<]<<<<]>>>[-<<<+>>>]<<[->+<[->->+>
>>>>]>[->>>>>+>>]<<<<<<<<]>>[-<<+>>]>>>[->>+<<]>[>[-<->]<[->+<]]>[[-]<<<[->+>-<<
]>[-<+>]+>+++++++[-<[->>++<<]>>[-<<+>>]<]<[->>>>+<<<<]>>]<<<]
UND, 209
Das Ergebnis wird in Zelle 10 geschrieben, der Zeiger endet in Zelle 5
>>>>>++++++++[-<<<<<[->>+<<[->>->+<]>>[->>>>+<<]<<<<]>>>[-<<<+>>>]<<[->+<[->->+>
>>>>]>[->>>>>+>>]<<<<<<<<]>>[-<<+>>]>>>[->[->+<]<]>[-]>[-<<<[->+>-<<]>[-<+>]+>++
+++++[-<[->>++<<]>>[-<<+>>]<]<[->>>>+<<<<]>>]<<<]
ODER 211
Das Ergebnis wird in Zelle 10 geschrieben, der Zeiger endet in Zelle 5
>>>>>++++++++[-<<<<<[->>+<<[->>->+<]>>[->>>>+<<]<<<<]>>>[-<<<+>>>]<<[->+<[->->+>
>>>>]>[->>>>>+>>]<<<<<<<<]>>[-<<+>>]>>>[->>+<<]>[->+<]>[[-]<<<[->+>-<<]>[-<+>]+>
+++++++[-<[->>++<<]>>[-<<+>>]<]<[->>>>+<<<<]>>]<<<]
Nach links drehen, 38
Ergebnis wird in Zelle 1 geschrieben, Zeiger endet in Zelle 4
[->++>+<[>-]>[->>+<]<<<]>>>>[-<<<+>>>]
NICHT, 7
Ergebnis wird in Zelle 1 geschrieben, Zeiger endet in Zelle 0
+[+>+<]
Erläuterung:
XOR, AND und OR funktionieren alle auf ähnliche Weise: Berechnen Sie n / 2 für jede Zahl und merken Sie sich n mod 2. Berechnen Sie das logische XOR / AND / OR für die einzelnen Bits. Wenn das resultierende Bit gesetzt ist, addieren Sie 2 ^ n zum Ergebnis. Wiederholen Sie das 8 Mal.
Dies ist das Speicherlayout, das ich verwendet habe:
0 1 2 3 4 5 6 7
n1 | n2 | marker | n/2 | 0 | counter | bit1 | bit2 |
8 9 10
temp | temp | result
Hier ist die Quelle für XOR (Zahlen geben an, wo sich der Zeiger zu diesem Zeitpunkt befindet):
>>>>>
++++ ++++ counter
[
-
<<<<<
divide n1 by two
[ 0
-
>>+ set marker 2
<< 0
[->>->+<] dec marker inc n/2
>> 2 or 4
[->>>>+<<]
<<<<
]
>>>
[-<<<+>>>]
<<
divide n2 by two
[ 1
-
>+ set marker 2
< 1
[->->+>>>>>] dec marker inc n/2
> 2 or 9
[->>>>>+>>]
<<<< <<<<
]
>>[-<<+>>] 3
>>> 6
[->>+<<]>[>[-<->]<[->+<]]> one bit xor 8
[
[-]<<< 5
[->+>-<<] copy counter negative
> 6
[-<+>]
+> 7
++++ +++ cell 6 contains a one and cell 7 how many bits to shift
[-<[->>++<<]>>[-<<+>>]<] 2^n
< 6
[->>>>+<<<<]
>> 8
]
<<<
]
Beim Drehen nach links befindet sich erneut eine Markierung in Zelle 2, um zu bestimmen, ob 2n Null ist, da Sie nur direkt bestimmen können, ob eine Zelle nicht Null ist. Wenn ja, wird ein Übertragsbit in Zelle 4 geschrieben und später zu 2n addiert. Dies ist das Speicherlayout:
0 1 2 3 4
n | 2n | marker | 0 | carry