14

python中的'~'是什么意思?

我不久前在 python 中找到了这个 BF 解释器。

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 是类似的东西

4

5 回答 5

21

按位 NOT,就像在 C 中一样。

在二进制补码表示中,~n等价于-n - 1

于 2010-06-12T03:47:52.093 回答
14

在这种特殊情况下,只需将 '~' 替换为 '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
于 2010-06-12T20:05:20.497 回答
10

并且提出一件事,没有提到其他答案:~用户定义类的行为可以通过覆盖__invert__方法(或者nb_invert如果您使用 Python/C API 的插槽)来更改。

于 2010-06-12T04:54:09.530 回答
7

只是为了强调这一点:“〜”被称为波浪号。

于 2010-06-12T03:52:18.840 回答
4

~是按位非。

我真的想不出一个很好的方式来说明它(除非你知道那-1是 的按位否定0),但维基百科条目非常好。

于 2010-06-12T03:47:35.137 回答