2010-06-12 49 views
12

¿Qué significa '~' en python?¿Qué significa "~" en python?

encontré este intérprete BF en python hace un tiempo.

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 

y quiero saber lo que hace porque quiero hacer uno por mi ti 84 (y un PF uno) BF

es http://en.wikipedia.org/wiki/Brainfuck y PF es algo similar

+9

Me resulta divertido que el intérprete de Python BF tenga nombres de variables tan crípticos y esté escrito utilizando tales construcciones de Python no estándar. Muy en el espíritu de BF, pero no en el espíritu de Python. – Omnifarious

+0

i segundo - estilo extraño de codificación (como si se tradujera del lenguaje de bajo nivel a python?) Pero funciona, lo probé con el programa hello-world.por cierto, no implementa el comando ',' (entrada) –

+2

@Omnifarious: si escribiera en el espíritu de Python, no estaría escribiendo un intérprete de BF. –

Respuesta

13

En este contexto particular, simplemente reemplace '~' por 'no'.

PS. vale, supongo que tendré que explicarlo, empecé a recibir una bofetada con -1, probablemente con la premisa de que no sé la diferencia entre la negación lógica y la de bit a bit.

El problema es que el código en la pregunta es roto. Hay un error en eso. Si comprueba cómo Brainfuck debería funcionar, entra dentro de [] llaves mientras que la celda de memoria actual es! = 0 (esto se comprueba como precondición al ingresar [ y como optimización antes de regresar de ]).

Pero en lugar de discutir, quizás es más fácil mostrarlo con ejemplos de que el código no funciona. Tomemos el sencillo programa '[+]'. Intentar ajustar esto debería simplemente salir (porque la celda actual es 0, ni siquiera ingresa el bucle). En cambio, si lo ejecuta en este intérprete, entra en un ciclo infinito.

Tan aquel que le solicito a revertir sus -1 votos si mi aclaración tiene sentido ahora ;-)

Aquí está el intérprete ligeramente embellecida, con fija ~ error y yo también agregó el , de entrada que faltan:

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

if ~ x se ejecutará para cada valor excepto -1 – mikerobi

+0

@mikerobi: ver mi respuesta - agregué la explicación y el código –

4

~ es a nivel de bit, no.

Realmente no puedo pensar en una buena forma de ilustrar que (a menos que sepa que -1 es la negación bit a bit de 0), pero the wikipedia entry es bastante bueno.

21

NOT en modo bit, al igual que en C

En representación de complemento a dos, ~n es equivalente a -n - 1.

+1

Para el propósito de las operaciones de cambio y máscara, siempre se asume la representación del complemento de dos para el número negativo en Python http://docs.python.org/reference/datamodel.html – jfs

6

Solo para aclarar el punto: el '~' se llama tilde.

+2

Te pediría +1 si no te estuviera dando gratis reps. – Ponkadoodle

10

Y para que aparezca una cosa ninguna de las otras respuestas mencionadas: el comportamiento de ~ para las clases definidas por el usuario se puede cambiar reemplazando el método __invert__ (o la ranura nb_invert si está utilizando la API Python/C) .

Cuestiones relacionadas