2010-06-12 3 views
12

Что означает «~» в python?Что означает «~» в python?

Я нашел этот интерпретатор BF в python некоторое время назад.

import sys 

#c,i,r,p=0,0,[0]*255,raw_input() 

c=0 
i=0 
p=raw_input()  
r=[0]*255 

while c<len(p): 
    m,n,u=p[c],0,r[i] 
    if m==">":i+=1 
    if m=="<":i-=1 
    if m=="+":r[i]+=1 
    if m=="-":r[i]-=1 
    if m==".":sys.stdout.write(chr(u)) 
    if m=="[": 
     if ~u: 
      while 1: 
       m=p[c] 
       if m=="]":n-=1 
       if m=="[":n+=1 
       if ~n:break 
       c+=1 
    if m=="]": 
     if u: 
      while 1: 
       m=p[c] 
       if m=="]":n-=1 
       if m=="[":n+=1 
       if ~n:break 
       c-=1  
    c+=1 

и я хочу знать, что он делает, потому что я хочу, чтобы на моей ти 84 (и PF один)

БФ http://en.wikipedia.org/wiki/Brainfuck и PF нечто подобное

+9

Мне смешно, что интерпретатор Python BF имеет такие имена загадочных переменных и записывается с использованием таких нестандартных конструкций Python. Очень в духе BF, но очень не в духе Python. – Omnifarious

+0

i второй - странный стиль кодирования (как если бы он переведен с низкоуровневого языка на python?), Но он работает - проверял его с помощью программы hello-world.btw, не выполняет команду ',' (input) –

+2

@Omnifarious - Если вы пишете в духе Python, вы не будете писать BF-интерпретатор. –

ответ

13

В этом конкретном контексте просто замените '~' на «нет».

PS. ок, я думаю, мне придется объяснять, - начал получать шлепанье с -1, возможно, в помещении я не знаю разницы между логическим и побитовым отрицанием.

Дело в том, что код в вопросе broken. В нем есть ошибка. Если вы проверите, как 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

, если ~ x будет выполняться для каждого значения, кроме -1 – mikerobi

+0

@mikerobi: см. Мой ответ - я добавил объяснение и код –

4

~ является побитовое нет.

Я не могу думать о хорошем пути, чтобы проиллюстрировать это (если вы не знаете, что -1 является побитовое отрицание 0), но the wikipedia entry довольно хорошо.

21

побитовое НЕ, так же, как в C.

В дополнение представления до двух, ~n эквивалентно -n - 1.

+1

Для операций сдвига и маски два дополнения для отрицательного числа всегда принимаются в Python. Http://docs.python.org/reference/datamodel.html – jfs

6

Просто для того, чтобы выразить суть: «~» называется тильдой.

+2

Я бы добавил +1, если бы я не давал вам бесплатно по донесению – Ponkadoodle

10

И чтобы принести одну вещь ни один из других ответов, упомянутые: поведение ~ для пользовательских классов может быть изменен с помощью переопределения __invert__ метода (или слота nb_invert, если вы используете Python/C API) ,

Смежные вопросы