В этом конкретном контексте просто замените '~' на 'not'.
PS. Ладно, думаю, мне придется объяснить - я начал получать пощечины с -1, вероятно, на основании того, что я не знаю разницы между логическим и побитовым отрицанием.
Дело в том, что код в вопросе сломан. В нем есть ошибка. Если проверить, как должен работать Brainfuck, то он зацикливается внутри скобок [ ], пока текущая ячейка памяти равна !=0 (это проверяется как предусловие при входе в [ и как оптимизация перед возвратом из []).
Но вместо того, чтобы спорить, возможно, проще показать на примерах, что код не работает. Возьмем простую программу '[+]'
. При попытке ее выполнить она должна просто выйти (поскольку текущая ячейка равна 0, она даже не войдет в цикл). Вместо этого, если запустить ее в этом интерпретаторе, она переходит в бесконечный цикл.
Поэтому я прошу вас вернуть свои -1 голос, если мое объяснение теперь имеет смысл ;-)
Вот интерпретатор, немного улучшенный, с исправленными ошибками ~
и я также добавил недостающие ,
входы:
from sys import stdin, stdout
bfHelloWorld = '++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.'
# http://esoteric.sange.fi/brainfuck/bf-source/prog/yapi.b
bfPiDigits = '''> +++++ (5 digits)
[<+>>>>>>>>++++++++++<<<<<<<-]>+++++[<+++++++++>-]+>>>>>>+[<<+++[>>[-<]<[>]<-]>>
[>+>]<[<]>]>[[->>>>+<<<<]>>>+++>-]<[<<<<]<<<<<<<<+[->>>>>>>>>>>>[<+[->>>>+<<<<]>
>>>>]<<<<[>>>>>[<<<<+>>>>-]<<<<<-[<<++++++++++>>-]>>>[<<[<+<<+>>>-]<[>+<-]<++<<+
>>>>>>-]<<[-]<<-<[->>+<-[>>>]>[[<+>-]>+>>]<<<<<]>[-]>+<<<-[>>+<<-]<]<<<<+>>>>>>>
>[-]>[<<<+>>>-]<<++++++++++<[->>+<-[>>>]>[[<+>-]>+>>]<<<<<]>[-]>+>[<<+<+>>>-]<<<
<+<+>>[-[-[-[-[-[-[-[-[-<->[-<+<->>]]]]]]]]]]<[+++++[<<<++++++++<++++++++>>>>-]<
<<<+<->>>>[>+<<<+++++++++<->>>-]<<<<<[>>+<<-]+<[->-<]>[>>.<<<<[+.[-]]>>-]>[>>.<<
-]>[-]>[-]>>>[>>[<<<<<<<<+>>>>>>>>-]<<-]]>>[-]<<<[-]<<<<<<<<]++++++++++.
'''
code = bfPiDigits # the code
data = [0] * 255 # data memory
cp = 0 # code pointer
dp = 0 # data pointer
while cp < len(code):
cmd = code[cp]
if cmd == '>': dp += 1
elif cmd == '<': dp -= 1
elif cmd == '+': data[dp] += 1
elif cmd == '-': data[dp] -= 1
elif cmd == '.': stdout.write(chr(data[dp]))
elif cmd == ',': data[dp] = ord(stdin.read(1))
elif cmd == '[' and not data[dp]: # skip loop if ==0
n = 0
while True:
cmd = code[cp]
if cmd == '[': n += 1
elif cmd == ']': n -= 1
if not n: break
cp += 1
elif cmd == ']' and data[dp]: # loop back if !=0
n = 0
while True:
cmd = code[cp]
if cmd == '[': n+=1
elif cmd == ']': n-=1
if not n: break
cp -= 1
cp += 1
~
не поразрядно.
Я не могу придумать хороший способ проиллюстрировать это (если вы не знаете, что -1
является побитовым отрицанием 0
), но запись в википедии довольно хорошо.
И, чтобы поднять одну вещь, ни один из других ответов не упомянул: поведение ~
для пользовательских классов можно изменить, переопределив __invert __
(или слот nb_invert
, если вы используете Python / C API).
Побитовое НЕ, как и в C.
В двухкомпонентном представлении, ~n
эквивалентно -n - 1
.