что '~' означает в Python? [дубликат]

13
задан hidroto 14 June 2010 в 05:54
поделиться

5 ответов

В этом конкретном контексте просто замените '~' на '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
14
ответ дан 1 December 2019 в 17:27
поделиться

~ не поразрядно.

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

4
ответ дан 1 December 2019 в 17:27
поделиться

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

10
ответ дан 1 December 2019 в 17:27
поделиться

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

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

21
ответ дан 1 December 2019 в 17:27
поделиться

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

7
ответ дан 1 December 2019 в 17:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: