Оцінка: 686
Усі фрагменти припускають, що числа вже завантажені в комірки 0 і 1 і що вказівник вказує на комірку 0. Я можу додати фрагмент atoi пізніше, якщо це потрібно для виклику. Наразі ви можете спробувати такий код:
+++++++++> number 1
++++< number 2
XOR, 221
Результат записується в комірку 10, вказівник закінчується на клітинку 5
>>>>>++++++++[-<<<<<[->>+<<[->>->+<]>>[->>>>+<<]<<<<]>>>[-<<<+>>>]<<[->+<[->->+>
>>>>]>[->>>>>+>>]<<<<<<<<]>>[-<<+>>]>>>[->>+<<]>[>[-<->]<[->+<]]>[[-]<<<[->+>-<<
]>[-<+>]+>+++++++[-<[->>++<<]>>[-<<+>>]<]<[->>>>+<<<<]>>]<<<]
І, 209
Результат записується в комірку 10, вказівник закінчується на клітинку 5
>>>>>++++++++[-<<<<<[->>+<<[->>->+<]>>[->>>>+<<]<<<<]>>>[-<<<+>>>]<<[->+<[->->+>
>>>>]>[->>>>>+>>]<<<<<<<<]>>[-<<+>>]>>>[->[->+<]<]>[-]>[-<<<[->+>-<<]>[-<+>]+>++
+++++[-<[->>++<<]>>[-<<+>>]<]<[->>>>+<<<<]>>]<<<]
АБО, 211
Результат записується в комірку 10, вказівник закінчується на клітинку 5
>>>>>++++++++[-<<<<<[->>+<<[->>->+<]>>[->>>>+<<]<<<<]>>>[-<<<+>>>]<<[->+<[->->+>
>>>>]>[->>>>>+>>]<<<<<<<<]>>[-<<+>>]>>>[->>+<<]>[->+<]>[[-]<<<[->+>-<<]>[-<+>]+>
+++++++[-<[->>++<<]>>[-<<+>>]<]<[->>>>+<<<<]>>]<<<]
Поворот ліворуч, 38
Результат записується в комірку 1, вказівник закінчується на клітинку 4
[->++>+<[>-]>[->>+<]<<<]>>>>[-<<<+>>>]
НЕ, 7
Результат записується в комірку 1, вказівник закінчується на комірку 0
+[+>+<]
Пояснення:
XOR, AND і АБО всі працюють аналогічно: Обчисліть n / 2 для кожного числа і запам’ятайте n mod 2. Обчисліть логічний XOR / AND / OR для одиничних біт. Якщо встановлений отриманий біт, додайте до результату 2 ^ n. Повторіть це 8 разів.
Це макет пам'яті, який я використав:
0 1 2 3 4 5 6 7
n1 | n2 | marker | n/2 | 0 | counter | bit1 | bit2 |
8 9 10
temp | temp | result
Ось джерело для XOR (цифри вказують, де знаходиться вказівник на той час):
>>>>>
++++ ++++ 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
]
<<<
]
Для обертання ліворуч ще раз є маркер у комірці 2, щоб визначити, чи 2n дорівнює нулю, оскільки ви можете лише визначити, чи клітина безпосередньо не дорівнює нулю. Якщо так, біт переносу записується в комірку 4 і пізніше додається до 2n. Це макет пам'яті:
0 1 2 3 4
n | 2n | marker | 0 | carry