Что означает "~" в питоне?

что означает '~' в 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

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

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

Ответ 1

В этом конкретном контексте просто замените '~' на '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

Ответ 2

Побитовое NOT, как в C.

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

Ответ 3

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

Ответ 4

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

Ответ 5

~ побитовое.

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